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

РЕКУРСИВНЫЕ АЛГОРИТМЫ - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Бинарный файл, обработка файла(сумма чисел) http://www.cyberforum.ru/cpp-beginners/thread182243.html
Создать бинарный файл f и записать в него целые числа. Организовать просмотр бинарного файла и его обработку: найти сумму чисел, предшествующих первому отрицательному числу в файле. Результат сохранить в текстовом файле. Не могу составить программу в плане функции обработки бинарного файла(про сумму чисел и т.п.) Подкиньте идею кто смыслит в этом пож.
C++ Протые множители Помогите решить задачу Задача: разложить данное число на простые множители http://www.cyberforum.ru/cpp-beginners/thread182236.html
работа с блоками C++
// This program demonstrates a block of code. #include <iostream> using namespace std; int main() { int a, b; cout << "Enter first number: ";
C++ Упорядочить строки матрицы по не убыванию наибольших элементов
Дана вещественная матрица размером 3 x 4. Упорядочить ее строки по не убыванию наибольших элементов в строках матрицы. в С. Завта лабу здавать очень нужно!
C++ Дан символ С. Вывести два символа, первый из которых предшествует символу С в кодовой таблице, а второй следует за символом С http://www.cyberforum.ru/cpp-beginners/thread182219.html
Дан символ С. Вывести два символа, первый из которых предшествует символу С в кодовой таблице, а второй следует за символом С
C++ Найти номер строки матрицы с наибольшей суммой элементов Дана матрица размера МхН.Найти номер ее строки с наибольшей суммой элементов и вывести данный номер, а также значение наибольшей суммы. подробнее

Показать сообщение отдельно
Mr.X
Эксперт С++
 Аватар для Mr.X
2803 / 1579 / 247
Регистрация: 03.05.2010
Сообщений: 3,667
27.11.2010, 17:41     РЕКУРСИВНЫЕ АЛГОРИТМЫ
Удалось обойтись без оператора switch:
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
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
//////////////////////////////////////////////////////////////////////////////////////
//Вывести значение целочисленного выражения, заданного в виде строки S. 
//Выражение определяется следующим образом (функция M возвращает 
//максимальный из своих параметров, а функция m — минимальный):
//<выражение> ::= <цифра> | M(<параметры>) | m(<параметры>)
//<параметры> ::= <выражение> | <выражение> , <параметры> 
//////////////////////////////////////////////////////////////////////////////////////
#include <algorithm>
#include <cctype>
#include <ctime>
#include <cstdlib>
#include <iostream>
#include <string>
#include <vector>
//////////////////////////////////////////////////////////////////////////////////////
typedef std::string       T_expr;
typedef std::vector<int>  T_parameters;
//////////////////////////////////////////////////////////////////////////////////////
//Объявления функций:
bool  calculate_expr           (T_expr&  expr,  int&           res        );
bool  calculate_parameters     (T_expr&  expr,  T_parameters&  parameters );
bool  calculate_prefix         (T_expr&  expr,  const T_expr&  PREFIX     );
bool  calculate_CLOSE_BRACKET  (T_expr&  expr                             );
//////////////////////////////////////////////////////////////////////////////////////
void  remove_spaces(T_expr&  expr)
{    
    for(;;)
    {
        T_expr::size_type  pos = expr.find_first_of(" \t");
        if(pos == T_expr::npos) break;        
        expr.erase(pos, 1);
    }
}
//////////////////////////////////////////////////////////////////////////////////////
bool  calculate_dig(T_expr&  expr, int&  res)
{
    bool  res_bool =    !expr.empty() 
                     && isdigit(expr[0]);
 
    if(res_bool)
    {
        res = expr[0] - '0';
        expr.erase(0, 1);
    }
    return  res_bool;
}
//////////////////////////////////////////////////////////////////////////////////////
bool  calculate_m_open_bracket(T_expr&  expr)
{
    return  calculate_prefix(expr, "m(");
}
//////////////////////////////////////////////////////////////////////////////////////
bool  calculate_m(T_expr&  expr, int& res)
{ 
    T_parameters  parameters;
    bool          res_bool =    calculate_m_open_bracket  (expr)
                             && calculate_parameters      (expr, parameters)
                             && calculate_CLOSE_BRACKET   (expr);
 
    if(res_bool)
    {
        res = *std::min_element(parameters.begin(), parameters.end());
    }      
    return  res_bool;
}
//////////////////////////////////////////////////////////////////////////////////////
bool  calculate_CLOSE_BRACKET(T_expr&  expr)
{
    return  calculate_prefix(expr, ")");
}
//////////////////////////////////////////////////////////////////////////////////////
bool  calculate_prefix(T_expr&  expr, const T_expr&  PREFIX)
{    
    T_expr::size_type  pos       = expr.find(PREFIX);
    bool               res_bool  = (pos == 0);
    if(res_bool)
    {        
        expr.erase(0, PREFIX.size());
    }
    return  res_bool;
}
//////////////////////////////////////////////////////////////////////////////////////
bool  calculate_COMMA(T_expr&  expr)
{
    return  calculate_prefix(expr, ",");
}
//////////////////////////////////////////////////////////////////////////////////////
bool  calculate_parameters_tail(T_expr&  expr, T_parameters&  parameters)
{
    return    !calculate_COMMA(expr) 
           || calculate_parameters(expr, parameters);
}
//////////////////////////////////////////////////////////////////////////////////////
bool  calculate_parameter(T_expr&  expr, T_parameters&  parameters)
{
    int   res       = 0;
    bool  res_bool  = calculate_expr(expr, res);
    if(res_bool)
    {
        parameters.push_back(res);
    }
    return  res_bool;
}
//////////////////////////////////////////////////////////////////////////////////////
bool  calculate_parameters(T_expr&  expr, T_parameters&  parameters)
{        
    return    calculate_parameter        (expr, parameters)
           && calculate_parameters_tail  (expr, parameters);    
}
//////////////////////////////////////////////////////////////////////////////////////
bool  calculate_M_open_bracket(T_expr&  expr)
{
    return  calculate_prefix(expr, "M(");
}
//////////////////////////////////////////////////////////////////////////////////////
bool  calculate_M(T_expr&  expr, int& res)
{    
    T_parameters  parameters;
    bool          res_bool =    calculate_M_open_bracket  (expr)
                             && calculate_parameters      (expr, parameters)
                             && calculate_CLOSE_BRACKET   (expr);
 
    if(res_bool)
    {
        res = *std::max_element(parameters.begin(), parameters.end());
    }
 
    return  res_bool;
}
//////////////////////////////////////////////////////////////////////////////////////
bool  calculate_expr(T_expr&  expr, int& res)
{
    return    calculate_M    (expr, res)
           || calculate_m    (expr, res)
           || calculate_dig  (expr, res);
}
//////////////////////////////////////////////////////////////////////////////////////
bool  calculate_expr_start(T_expr&  expr, int&  res)
{
    remove_spaces(expr);    
    return    calculate_expr(expr, res)
           && expr.empty();    
}
//////////////////////////////////////////////////////////////////////////////////////
int main()
{
    //test
    srand(static_cast<unsigned>(time(0)));
    
    T_expr  expr = "0";
    T_expr  mM;
    for(int i = 0; i < 3; ++i)
    {
        mM.clear();
        mM += (rand() % 2 ? "m" : "M");        
        mM += (rand() % 10 ? " " : "\t");
        mM += '(';
        mM += (rand() % 10 ? " " : "\t");
        mM += rand() % 10 + '0';
        mM += (rand() % 10 ? " " : "\t");
        mM += ",";
        mM += (rand() % 10 ? " " : "\t");
        mM += rand() % 10 + '0';
 
        mM += (rand() % 10 ? " " : "\t");
        mM += ")";
        mM += (rand() % 10 ? " " : "\t");
 
        T_expr::size_type  pos = expr.find_first_of("0123456789");
 
        if(pos == T_expr.npos) break;
 
        rand() % 10 ? expr.replace(pos, 1, mM) : expr.replace(pos, 1, "$");
    }
 
    std::cout << expr
              << std::endl;    
 
    int  res = 0;
    if(calculate_expr_start(expr, res))
    {
        std::cout << "Result: "
                  << res;                       
    }
    else
    {
        std::cout << "Expression is not correct.";
    }
    std::cout << std::endl
              << std::endl
              << std::endl;   
 
    /*    
    for(;;)
    {
        std::cout << "Input expression: ";
        T_expr  expr;
        std::getline(std::cin, expr);        
        int     res;                
 
        if(expr.empty()) break;
 
        if(calculate_expr_start(expr, res))
        {
            std::cout << "Result: "
                      << res;                       
        }
        else
        {
            std::cout << "Expression is not correct.";
        }
        std::cout << std::endl
                  << std::endl
                  << std::endl; 
    } 
    */
}
 
Текущее время: 20:55. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru