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

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

Войти
Регистрация
Восстановить пароль
 
Stason676
Заблокирован
#1

Спрашиваю совет по стилю написания кода - C++

11.11.2013, 09:54. Просмотров 465. Ответов 10
Метки нет (Все метки)

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
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
#include <vector>
#include <string>
 
class Errors
{
private:
 
    size_t i;                   //Глобальный счетчик циклов.
    std::string exp;            //Входящая строка.
 
    //Структура для хранения кода ошибки, сообщения об ошибке и индекс некоректного символа.
    struct SError
    {
        std::string message;
        size_t errCode;
        size_t chIndex;
    };
    //Вектор для хранения структур с ошибками.
    std::vector<SError> errorVector;
 
#define IsLp(a)    (a == '(')       //ture если левая скобка.
#define IsRp(a)    (a == ')')       //ture если правая скобка.
#define IsMin(a)   (a == '-')       //ture если минус.
#define IsSqr(a)   (a == '^')       //ture если квадратный корень.
#define IsStart(a) (a == '#')       //true если начало строки.
#define IsEnd(a)   (a == ';')       //true если конец стоки.
 
    //Инициализация структуры ошибок и добавление ее в контенер vektor.
    void AddEr(size_t eCod, size_t j)
    {
        std::string messages[] = 
        {
            "Ошибка.Переменная не может начинаться с цифры.\n",         //Err0
            "Ошибка.Пустые скобки.\n",                                  //Err1
            "Ошибка.Баланс скобок нарушен.\n",                          //Err2
            "Ошибка.Порядок символов нарушен\n",                        //Err3
            "Ошибка.Символ не опознан.\n",                              //Err4
            "Введите выражение.\n"                                      //Err5
 
        };
 
        SError *p = new SError;
        p -> message = messages[eCod];
        p -> errCode = eCod;
        p -> chIndex = j;
        errorVector.push_back(*p);
    }
 
    //true если цифра.
    bool IsDigit(char ch)
    {
        char table[] = { '0','1','2','3','4','5','6','7','8','9','.','\0' };
 
        for(int i = 0; table[i]; ++i)
            if(ch == table[i])
                return true;
 
        return false;
    }
 
    //true если буква.
    bool IsAlpha(char ch)
    {
        char table[] = 
        {  
            'A','a','B','b','C','c','D','d','E','e','F','f','G','g','H','h','I','i',
            'J','j','K','k','L','l','M','m','N','n','O','o','P','p','Q','q','R','r',
            'S','s','T','t','U','u','V','v','W','w','X','x','Y','y','Z','z','\0'
        };
 
        for(int i = 0; table[i]; ++i)
            if(ch == table[i])
                return true;
 
        return false;
    }
 
    //true если оператор бинарный.
    bool IsBinOp(char ch)
    {
        char table[] = { '*', '/', '+', '\0' };
 
        for(int i = 0; table[i]; ++i)
            if(ch == table[i])
                return true;
 
        return false;
    }
 
    //Состояния автомата.
    enum State { STA, END, OPR, BIO, SQR, MIN, LP, RP, BAD} state, memory;  //STA-начало строки, END-конец строки, OPR-операнд, 
                                                                            //BIO-бинарный знак операции, SQR-квадратный корень,
                                                                            //MIN-минус, LP-левая скобка, RP-правая скобка,
                                                                            //BAD-символ не опознан. state-текущее состояние,
                                                                            //memory-предыдущее состояние.
 
    //Парсер
    State Parser(char ch)
    {
        if (IsStart(ch))
        {
            state = STA;
            return state;
        }
        else if(IsEnd(ch))
        {
            state = END;
            return state;
        }
        else if(IsAlpha(ch) || IsDigit(ch))
        {
            state = OPR;
            return state;
        }
        else if(IsBinOp(ch))
        {
            state = BIO;
            return state;
        }
        else if(IsSqr(ch))
        {
            state = SQR;
            return state;
        }
        else if(IsMin(ch))
        {
            state = MIN;
            return state;
        }
        else if(IsLp(ch))
        {
            state = LP;
            return state;
        }
        else if(IsRp(ch))
        {
            state = RP;
            return state;
        }
        else
        {
            state = BAD;
            return state;
        }
    }
    
    //Проверка операндов, условие - переменная не должена начинаться с цифры,
    //true если переменная начинается с цыфры.
    bool ChekErrOp()
    {
        std::string op;
 
        for ( ; i < exp.length(); ++i)
        {
            if(IsDigit(exp[i]) || IsAlpha(exp[i]))
                op += exp[i];
            else
            {
                i--;
                break;
            }
        }
        
        if(!op.empty())
            if(IsDigit(op[0]))
                for(size_t j = 1; j < op.length(); ++j)
                    if(IsAlpha(op[j]))
                        return true;
 
        return false;
    }
 
    //Поиск недопустимых последовательностей во входящей строке.
    void BadChain()
    {
        for (i = 0; i < exp.length(); ++i)
        {
            switch(Parser(exp[i]))
            {
                case STA:
                    memory = STA;
                    break;
                case END:
                    switch(memory)
                    {
                        case STA:
                            AddEr(5, i - 1);
                            break;
                        case BIO: case SQR: case MIN: case LP:
                            AddEr(3, i - 2);
                            break;
                    }
                    memory = END;
                    break;
                case OPR:
                    if(memory == RP) { AddEr(3, i - 1); }
                    if(ChekErrOp()) { AddEr(0, i - 1); }
                    memory = OPR;
                    break;
                case BIO:
                    switch(memory)
                    {
                        case STA: case BIO: case SQR: case MIN: case LP: case BAD:
                            AddEr(3, i - 1);
                            memory = BIO;
                            break;
                    }
                    memory = BIO;
                    break;
                case SQR:
                    switch(memory)
                    {
                        case OPR: case BIO: case SQR: case MIN: case LP: case BAD:
                            AddEr(3, i - 1);
                            memory = SQR;
                            break;
                    }
                    memory = SQR;
                    break;
                case MIN:
                    switch(memory)
                    {
                        case BIO: case SQR: case MIN: case BAD:
                            AddEr(3, i - 1);
                            memory = MIN;
                            break;
                    }
                    memory = MIN;
                    break;
                case LP:
                    switch(memory)
                    {
 
                        case OPR: case RP: case BAD:
                            AddEr(3, i - 1);
                            memory = LP;
                            break;
                    }
                    memory = LP;
                    break;
                case RP:
                    switch(memory)
                    {
                        case STA: case BIO: case SQR: case MIN: case BAD:
                            AddEr(3, i - 1);
                            memory = RP;
                            break;
                        case LP:
                            AddEr(1, i - 1);
                            memory = RP;
                            break;
                    }
                    memory = RP;
                    break;
                case BAD:
                    AddEr(4, i - 1);
                    memory = BAD;
                    break;
            }
        }
    }
 
public:
    //Конструктор(привидение входящей строки в приемлемое состояние).
    Errors(std::string stIn)
    {
        this->exp = stIn;                           //Инициализация глобальной переменной(входящая строка).
 
        for(size_t j = 0; j < exp.length(); ++j)    //Замена зарезервированных символов '#' и ';' на '@'.
            if(exp[j] == '#' || exp[j] == ';')
                exp[j] = '@';
 
        exp.insert(0, "#");                         //Вcтавить в начало строки '#' чтобы переключть автомат в стстояние "STA".
        exp.insert(exp.length(), ";");              //Вcтавить в конец строки ';' чтобы переключть автомат в стстояние "END".
 
        BadChain();
    }
 
    //Возвратить вектор с ошибками.
    std::vector<SError> GetErrors()
    {
        return errorVector;
    }
};
Вот класс, определяет недопустимые последовательности математического выражение типа (1+2)-(^(a2-b2))*3, хочу узнать в хорошем стиле ли написан он. Если можно совет что в нем исправить. Спасибо.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.11.2013, 09:54     Спрашиваю совет по стилю написания кода
Посмотрите здесь:

Вопрос по стандартам написания кода - C++
Положим, что я пишу код на С++ и использую расширения .cpp для файлов, но при этом использую, в большинстве своем, функции, наследованные...

Обработка ошибок в процессе написания кода - C++
Допустим есть большая программа. Десяток(ки) файлов, файлы эти в папках. Часто используется проверка в функциях на адекватные...

Проверьте правильность написания кода и коментарии - C++
Задача: Написать программу которая принимает в качестве аргумента имя файла f с русским текстом и печатает его в точности по одному...

Небольшой шаблонный класс matrix: комментарии/критика относительно кода с точки зрения правильности написания - C++
В плане своего общего развития написал не большой шаблонный класс matrix. Хочу поделиться своей работой с остальными, - может кому то это...

Совет по оформлению кода - C++
Есть программа, работает нормально. Обрабатывает из файла двумерный массив и выводит измененный (минимальный элемент ниже главной диагонали...

нужен совет по написанию кода - C++
Здравствуйте уважаемые программисты начинающие и специолисты у меня к вам очень волнующий для меня вопрос мне нужна информация по переводу...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
11.11.2013, 10:01     Спрашиваю совет по стилю написания кода #2
Цитата Сообщение от Stason676 Посмотреть сообщение
#define IsLp(a) * *(a == '(') * * * //ture если левая скобка.
#define IsRp(a) * *(a == ')') * * * //ture если правая скобка.
#define IsMin(a) * (a == '-') * * * //ture если минус.
#define IsSqr(a) * (a == '^') * * * //ture если квадратный корень.
#define IsStart(a) (a == '#') * * * //true если начало строки.
#define IsEnd(a) * (a == ';') * * * //true если конец стоки.
лучше делай функциями. Компилятор их все равно сделаеть inline и они ещё препроцессором вставятся прямо в код, но зато читается лучше, чем через define
ShadowFirst
54 / 47 / 1
Регистрация: 31.10.2013
Сообщений: 161
11.11.2013, 12:54     Спрашиваю совет по стилю написания кода #3
Если говорить по стилю написания, то Начнем с того что методы и свойства разделяются разными файлами. Свойства с объявлениями методов, а также inline методы и шаблоны находятся в файле *.h, а сами методы находятся в файле *.cpp.

Еще у вас много объявлений массивов который можно вынести и сделать статическими, а не объявлять их снова каждый раз, если конечно за вас это не делает сам компилятор, что вероятнее.

Но это только поверхностный осмотр был.
Tulosba
:)
Эксперт С++
4393 / 3236 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
11.11.2013, 15:13     Спрашиваю совет по стилю написания кода #4
Stason676, в функции Parser(char ch) можно обойтись одним return state; в конце.
Что-то не заметил, где удаляются объекты, которые создаются в 42 строке.
Таблицы символов проще задать строкой.
Stason676
Заблокирован
11.11.2013, 19:35  [ТС]     Спрашиваю совет по стилю написания кода #5
Цитата Сообщение от Tulosba Посмотреть сообщение
в функции Parser(char ch) можно обойтись одним return state;
я думал что если нашел совпадение то нет смысла проверять остальное или я не правильно думал?
Цитата Сообщение от Tulosba Посмотреть сообщение
где удаляются объекты, которые создаются в 42 строке.
эти объекты нужны для того что бы хранить ошибки зачем их удалять?
Tulosba
:)
Эксперт С++
4393 / 3236 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
11.11.2013, 20:44     Спрашиваю совет по стилю написания кода #6
Цитата Сообщение от Stason676 Посмотреть сообщение
я думал что если нашел совпадение то нет смысла проверять остальное или я не правильно думал?
Так остальное и не будет проверяться. Ветка же else-if идет.
Цитата Сообщение от Stason676 Посмотреть сообщение
эти объекты нужны для того что бы хранить ошибки зачем их удалять?
Если ошибок будет много и они будут продолжать появляться, в конечном итоге закончится свободная память. Т.о. программа не может работать в режиме 24/7.
Stason676
Заблокирован
11.11.2013, 21:42  [ТС]     Спрашиваю совет по стилю написания кода #7
Цитата Сообщение от Tulosba Посмотреть сообщение
Т.о. программа не может работать в режиме 24/7
стесняюсь спросить что за режим.
Цитата Сообщение от Tulosba Посмотреть сообщение
Если ошибок будет много и они будут продолжать появляться, в конечном итоге закончится свободная память
то есть нужно диструктор создать и удалять в нем оператором delete[]?
Tulosba
:)
Эксперт С++
4393 / 3236 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
11.11.2013, 21:50     Спрашиваю совет по стилю написания кода #8
Stason676, 24/7. 24 часа, 7 дней в неделю. Круглосуточно, короче говоря.
Цитата Сообщение от Stason676 Посмотреть сообщение
то есть нужно диструктор создать и удалять в нем оператором delete[]?
Во-первых, непонятно зачем вообще делать в куче, если можно создать элемент на стеке. При push_back() он всё равно копируется. Во-вторых, не delete[], а delete. delete[] для new[], delete для new.
Stason676
Заблокирован
12.11.2013, 12:44  [ТС]     Спрашиваю совет по стилю написания кода #9
Я понял правильно, в автоматической памяти объекты уничтожаются автоматически при выходе из процедуры, а в куче захваченная память остается захваченной пока не завершится процесс main или не освободишь память вручную, даже если указатель уже не актуален или указывает на другой объект?
И еще есть вопрос, а по логике программа как? Есть более компактный вариант на си или си++.
Спасибо.
Raali
12.11.2013, 13:31
  #10

Не по теме:

Цитата Сообщение от Stason676 Посмотреть сообщение
стесняюсь спросить что за режим.
как у ларька круглосуточного

MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.11.2013, 13:44     Спрашиваю совет по стилю написания кода
Еще ссылки по теме:

после написания и компеляции кода в DEV C ++ и при попытки сгенерировать программу в комадной строке запрос на введения температцры в Цельсиях... - C++
Друзья помогите с решением такой вроде бы не серьёзной , но довольна не камфорной проблемы. Начал изучать С++ скачал себе компилятор ,...

о правильности написания - C++
Всем привет! Есть неясности: Имеем функцию: void foo(int* i); Как правильнее ее описать и вызывать? В книгах выдел 2...

Порядок написания функций - C++
Только начал учиться программировать. Visual studio 2010 при компиляции пишет, что factorial не идентифицирован. Если изменить порядок...

Написания класса Car - C++
Всем добрый день. Поскольку я учусь на 1 курсе, и материал скучный , я решил сам изучать С++. Решил написать задачку: Реализовать...


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

Или воспользуйтесь поиском по форуму:
Tulosba
:)
Эксперт С++
4393 / 3236 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
12.11.2013, 13:44     Спрашиваю совет по стилю написания кода #11
Цитата Сообщение от Stason676 Посмотреть сообщение
Я понял правильно
правильно.
Цитата Сообщение от Stason676 Посмотреть сообщение
Есть более компактный вариант на си или си++.
В логику не вникал. Почти всегда можно сделать более компактно. Особенно учитывая, что Вы новичок в этом деле.
Yandex
Объявления
12.11.2013, 13:44     Спрашиваю совет по стилю написания кода
Ответ Создать тему
Опции темы

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