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

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

Войти
Регистрация
Восстановить пароль
 
satanehl
1 / 1 / 0
Регистрация: 06.10.2011
Сообщений: 7
#1

Проверить правильность расстановки символов “/*” и “*/” для комментариев - C++

19.10.2011, 10:23. Просмотров 842. Ответов 8
Метки нет (Все метки)

Проверить правильность расстановки символов “/*” и “*/” для комментариев в фрагменте программы на языке С++.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.10.2011, 10:23
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Проверить правильность расстановки символов “/*” и “*/” для комментариев (C++):

Дана строка символов проверить правильность расстановки круглых и квадратных скобок в выражениях - C++
дана строка символов проверить правильность расстановки круглых и квадратных скобок в выражениях

Проверить правильность расстановки скобок - C++
Помогите написать программу на c++. Дана строка, содержащая латинские буквы и скобки трех видов: «()», «», «{}». Если скобки расставлены...

Работа со стеком (проверить правильность расстановки скобок) - C++
Дано математическое выражение, к примеру {x+(g-*c)-(q+w)}. Необходимо проверить,правильно ли расставлены скобки. Проверять следует...

Проверить правильность расстановки кораблей. Морской бой - C++
Есть матрица NxM, где расставлены корабли. Корабли не стоят на краю матрицы, кол-во 4-х клеточных кораблей - 1, 3-х клет. - 2, 2-х...

В символьной строке проверить правильность расстановки скобок - C++
Есть строка, нужно проверить её на правильное раставление скобок. Как это организовать правильно?

Проверить правильность расстановки в тексте круглых скобок - C++
Задача: Проверить правильность расстановки в тексте круглых скобок. #include <iostream> #include <cstring> using namespace...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
fasked
Эксперт С++
4936 / 2516 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
19.10.2011, 10:27 #2
satanehl, посчитать количество символов начала комментариев "/*" и конца комментариев "*/". Их разница должна быть равна нулю, в простейшем случае.
0
Nameless One
Эксперт С++
5773 / 3424 / 255
Регистрация: 08.02.2010
Сообщений: 7,447
19.10.2011, 10:40 #3
fasked, не получится:
C
1
*/ wrong comment /*
0
fasked
Эксперт С++
4936 / 2516 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
19.10.2011, 10:41 #4
Nameless One, стеком.

Не по теме:

утро такое утро

0
Nameless One
Эксперт С++
5773 / 3424 / 255
Регистрация: 08.02.2010
Сообщений: 7,447
19.10.2011, 10:42 #5
Ну и от себя предложу вариант с конечным автоматом
0
diagon
Higher
1929 / 1195 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
19.10.2011, 10:48 #6
Цитата Сообщение от fasked Посмотреть сообщение
satanehl, посчитать количество символов начала комментариев "/*" и конца комментариев "*/". Их разница должна быть равна нулю, в простейшем случае.
C++
1
std::string str("/* not comment...");
0
fasked
Эксперт С++
4936 / 2516 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
19.10.2011, 10:57 #7
diagon,
Цитата Сообщение от diagon Посмотреть сообщение
в простейшем случае.
я имел в виду именно это
0
Nameless One
Эксперт С++
5773 / 3424 / 255
Регистрация: 08.02.2010
Сообщений: 7,447
19.10.2011, 11:44 #8
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
В первом приближении, ввод из файлов и обработку ошибок ввода делать не стал:
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
#include <stdio.h>
#include <stdlib.h>
 
/* состояние автомата */
enum state
{
    NONE,
    COMMENT,
    STRING_LITERAL,
    END_OF_FILE,
    ERROR
};
 
/* используется для проверки символа комментария
 * в строковом литерале.
 * И да, это многострочный комментарий
 */
void silly_fun(const char* unused)
{
}
 
int main(int argc, char* argv[])
{
    enum state state;       /* текущее состояние */
    char prev, curr;        /* предыдущий и текущий символы */
 
    int ret;
    
    state = NONE;
 
    ret = scanf("%c", &prev);
 
    if(ret == EOF)
    state = END_OF_FILE;
    
    while(state != END_OF_FILE && state != ERROR)
    {
    ret = scanf("%c", &curr);
 
    switch(state)
    {
    case NONE:
 
        if(ret == EOF)
        state = END_OF_FILE;
        
        else if(curr == '*' && prev == '/')
        state = COMMENT;
 
        else if(curr == '\"')
        state = STRING_LITERAL;
        
        break;
 
    case COMMENT:
        /* внутри комментария */
        if(ret == EOF)
        state = ERROR;
        
        else if(curr == '/' && prev == '*')
        state = NONE;
                
        break;
 
    case STRING_LITERAL:
        /* внутри строкового литерала */
        if(ret == EOF)  /* по идее ошибка, но она не имеет отношения
                 * к проверке правильности комментариев */
        state = END_OF_FILE;
        
        else if(curr == '\"')
        state = NONE;
 
        break;
 
    case END_OF_FILE:
        /* этого никогда не случится */
        break;
 
    case ERROR:
        /* этого никогда не случится */
        break;
    }
    prev = curr;
    }
 
    if(state == ERROR)
    puts("Oh, no!"), exit(1);
 
    puts("OK");
    
    silly_fun("wrong /* comment inside of a string literal");
    
    exit(0);
}
тест
Код
[nameless@desktop c]$ cat main.c | ./sample # проверяем сами себя
OK
[nameless@desktop c]$ for i in /usr/include/*.h; do echo -ne "$i\t"; cat $i | ./sample; done/usr/include/aio.h	OK
/usr/include/aliases.h	OK
/usr/include/alloca.h	OK
/usr/include/a.out.h	OK
/usr/include/argp.h	OK
/usr/include/argz.h	OK
/usr/include/ar.h	OK
/usr/include/assert.h	OK
/usr/include/autosprintf.h	OK
/usr/include/byteswap.h	OK
/usr/include/complex.h	OK
/usr/include/cpio.h	OK
/usr/include/crypt.h	OK
/usr/include/ctype.h	OK
/usr/include/dirent.h	OK
/usr/include/dlfcn.h	OK
/usr/include/elf.h	OK
/usr/include/endian.h	OK
/usr/include/envz.h	OK
/usr/include/err.h	OK
/usr/include/errno.h	OK
/usr/include/error.h	OK
/usr/include/execinfo.h	OK
/usr/include/fcntl.h	OK
/usr/include/features.h	OK
/usr/include/fenv.h	OK
/usr/include/FlexLexer.h	OK
/usr/include/fmtmsg.h	OK
/usr/include/fnmatch.h	OK
/usr/include/fpu_control.h	OK
/usr/include/fstab.h	OK
/usr/include/ft2build.h	OK
/usr/include/fts.h	OK
/usr/include/ftw.h	OK
/usr/include/_G_config.h	OK
/usr/include/gconv.h	OK
/usr/include/GeoIPCity.h	OK
/usr/include/GeoIP.h	OK
/usr/include/GeoIPUpdate.h	OK
/usr/include/getopt.h	OK
/usr/include/gettext-po.h	OK
/usr/include/glob.h	OK
/usr/include/gmp.h	OK
/usr/include/gmp-i386.h	OK
/usr/include/gmp-mparam.h	OK
/usr/include/gmp-mparam-i386.h	OK
/usr/include/gmpxx.h	OK
/usr/include/gnu-versions.h	OK
/usr/include/grp.h	OK
/usr/include/gshadow.h	OK
/usr/include/gssapi.h	OK
/usr/include/iconv.h	OK
/usr/include/ieee754.h	OK
/usr/include/ifaddrs.h	OK
/usr/include/inttypes.h	OK
/usr/include/kdb.h	OK
/usr/include/keyutils.h	OK
/usr/include/krb5.h	OK
/usr/include/langinfo.h	OK
/usr/include/lastlog.h	OK
/usr/include/libgen.h	OK
/usr/include/libintl.h	OK
/usr/include/libio.h	OK
/usr/include/limits.h	OK
/usr/include/link.h	OK
/usr/include/locale.h	OK
/usr/include/malloc.h	OK
/usr/include/math.h	OK
/usr/include/mcheck.h	OK
/usr/include/memory.h	OK
/usr/include/mntent.h	OK
/usr/include/monetary.h	OK
/usr/include/mp.h	OK
/usr/include/mqueue.h	OK
/usr/include/netapi.h	OK
/usr/include/netdb.h	OK
/usr/include/nl_types.h	OK
/usr/include/nss.h	OK
/usr/include/obstack.h	OK
/usr/include/paths.h	OK
/usr/include/poll.h	OK
/usr/include/printf.h	OK
/usr/include/profile.h	OK
/usr/include/pthread.h	OK
/usr/include/pty.h	OK
/usr/include/pwd.h	OK
/usr/include/re_comp.h	OK
/usr/include/regex.h	OK
/usr/include/regexp.h	OK
/usr/include/resolv.h	OK
/usr/include/sched.h	OK
/usr/include/search.h	OK
/usr/include/semaphore.h	OK
/usr/include/setjmp.h	OK
/usr/include/sgtty.h	OK
/usr/include/shadow.h	OK
/usr/include/signal.h	OK
/usr/include/spawn.h	OK
/usr/include/stab.h	OK
/usr/include/stdint.h	OK
/usr/include/stdio_ext.h	OK
/usr/include/stdio.h	OK
/usr/include/stdlib.h	OK
/usr/include/strata_client.h	OK
/usr/include/string.h	OK
/usr/include/strings.h	OK
/usr/include/syscall.h	OK
/usr/include/sysexits.h	OK
/usr/include/syslog.h	OK
/usr/include/tar.h	OK
/usr/include/termio.h	OK
/usr/include/termios.h	OK
/usr/include/tgmath.h	OK
/usr/include/thread_db.h	OK
/usr/include/time.h	OK
/usr/include/ttyent.h	OK
/usr/include/ucontext.h	OK
/usr/include/ulimit.h	OK
/usr/include/unistd.h	OK
/usr/include/ustat.h	OK
/usr/include/utime.h	OK
/usr/include/utmp.h	OK
/usr/include/utmpx.h	OK
/usr/include/values.h	OK
/usr/include/wait.h	OK
/usr/include/wchar.h	OK
/usr/include/wctype.h	OK
/usr/include/wordexp.h	OK
/usr/include/xf86drm.h	OK
/usr/include/xf86drmMode.h	OK
/usr/include/xlocale.h	OK
/usr/include/zconf.h	OK
/usr/include/zlib.h	OK
[nameless@desktop c]$
5
Mr.X
Эксперт С++
3049 / 1694 / 265
Регистрация: 03.05.2010
Сообщений: 3,867
22.10.2011, 11:00 #9
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
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
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
/////////////////////////////////////////////////////////////////////////////////////////
//Проверить правильность расстановки символов “/*” и “*/” для комментариев 
//во фрагменте программы на языке С++. 
/////////////////////////////////////////////////////////////////////////////////////////
#include <cctype>
#include <fstream>
#include <iostream>
#include <sstream>
#include <string>
/////////////////////////////////////////////////////////////////////////////////////////
typedef std::string         T_str;
typedef T_str::size_type    T_pos;
/////////////////////////////////////////////////////////////////////////////////////////
const char  SLASH           = '/';
const char  ASTERISK        = '*';
const char  BACKSLASH       = '\\';
const char  SINGLE_QUOTE    = '\'';
const char  DOUBLE_QUOTE    = '"';
/////////////////////////////////////////////////////////////////////////////////////////
enum  T_state
{
    TEXT_STATE,
    C_COMMENT_STATE,
    CPP_COMMENT_STATE,
    SYMB_LITERAL_STATE,
    STR_LITERAL_STATE,
    ERROR_STATE
};
/////////////////////////////////////////////////////////////////////////////////////////
void  TEXT_STATE_parse
    (
        const T_str&    s,
        int             symb_ind,
        int             str_ind,                        
        int&            C_comment_begin_symb_ind,                      
        int&            C_comment_begin_str_ind,                        
        T_state&        cur_state
    )
{
    switch( s[symb_ind] )
    {
    //Начало C-комментария.
    case ASTERISK:
        if(
                symb_ind            !=  0            
            &&  s[symb_ind - 1]     ==  SLASH 
          )
        {
            cur_state               = C_COMMENT_STATE;
            C_comment_begin_symb_ind  = symb_ind - 1;
            C_comment_begin_str_ind   = str_ind;            
        }
        break;
 
    //Конец C-комментария или начало C++-комментария.
    case SLASH:
        if(symb_ind != 0)
        {
            switch( s[symb_ind - 1] )
            {
            case  ASTERISK:
                cur_state = ERROR_STATE;
                break;
 
            case  SLASH:
                if( symb_ind != s.size() - 1 )
                {
                    cur_state = CPP_COMMENT_STATE;
                }
                break;
            }
        }
        break;
 
    case SINGLE_QUOTE:
        if( symb_ind == s.size() - 1 )
        {
            cur_state = ERROR_STATE;
        }
        else
        {
            cur_state = SYMB_LITERAL_STATE;
        }        
        break;
 
    case DOUBLE_QUOTE:
        if( symb_ind == s.size() - 1 )
        {
            cur_state = ERROR_STATE;
        }
        else
        {
            cur_state = STR_LITERAL_STATE;
        }              
        break;
    }
}
/////////////////////////////////////////////////////////////////////////////////////////
void  C_COMMENT_STATE_parse
    (
        const T_str&    s,
        int             symb_ind,
        int             str_ind,                        
        int&            C_comment_begin_symb_ind,                      
        int&            C_comment_begin_str_ind,                        
        T_state&        cur_state
    )
{
    switch( s[symb_ind] )
    {
    case  SLASH:
        if(
                symb_ind            !=  0
            &&  s[symb_ind - 1]     ==  ASTERISK
            &&  (       
                        str_ind    !=   C_comment_begin_str_ind
                    ||  symb_ind - 1 - C_comment_begin_symb_ind > 1
                )
          )
        {
            cur_state = TEXT_STATE;
        }
        break;
    }
}
/////////////////////////////////////////////////////////////////////////////////////////
void  CPP_COMMENT_STATE_parse
    (
        const T_str&    s,
        int             symb_ind,
        T_state&        cur_state
    )
{
    //Если это последний непробельный символ в строке, то.
    if( symb_ind == s.size() - 1 )
    {
        cur_state = TEXT_STATE;
    }
}
/////////////////////////////////////////////////////////////////////////////////////////
void  SYMB_LITERAL_STATE_parse
    (
        const T_str&    s,
        int             symb_ind,
        T_state&        cur_state
    )
{
    switch( s[symb_ind] )
    {
    case  SINGLE_QUOTE:
        if( s[symb_ind - 1] != BACKSLASH )
        {
            cur_state = TEXT_STATE;
        }
        break;
 
    default:
        //Если это последний непробельный символ в строке, то.
        if( symb_ind == s.size() - 1 )
        {
            cur_state = ERROR_STATE;
        }
    }
}
/////////////////////////////////////////////////////////////////////////////////////////
void  STR_LITERAL_STATE_parse
    (
        const T_str&    s,
        int             symb_ind,
        T_state&        cur_state
    )
{
    switch( s[symb_ind] )
    {
    case  DOUBLE_QUOTE:
        if( 
                symb_ind            == 0
            ||  s[symb_ind - 1]     != BACKSLASH 
          )
        {
            cur_state = TEXT_STATE;
        }
        break;
 
    default:
        //Если это последний непробельный символ в строке и это не обратный слэш, то.
        if(
                symb_ind        ==  s.size() - 1               
            &&  s[symb_ind]     !=  BACKSLASH
          )
        {
            cur_state = ERROR_STATE;
        }
        break;
    }
}
/////////////////////////////////////////////////////////////////////////////////////////
bool  C_comments_in_CPP_text_are_correct
    (
        const T_str&    ifilename,
        bool&           file_is_open
    )
{
    std::ifstream   ifile( ifilename.c_str() );
    file_is_open = ifile != 0;
    if( !file_is_open )
    {
        return  false;
    }
 
    T_str       s;             
    
    T_state     cur_state                   = TEXT_STATE;
    int         str_ind                     = 0; 
 
    int         C_comment_begin_symb_ind    = 0;
    int         C_comment_begin_str_ind     = 0;   
 
    //Обрабатываем строки файла.
    while( getline(ifile, s) )
    {  
        ++str_ind;
 
        while( 
                    !s.empty()
                &&  isspace( *s.rbegin() ) 
             )
        {
            s.erase( s.size() - 1 );
        }        
        
        for(size_t  symb_ind = 0; symb_ind < s.size(); ++symb_ind)
        {               
            switch(cur_state)
            {
            case  TEXT_STATE:
                TEXT_STATE_parse
                    (
                        s,
                        symb_ind,
                        str_ind,                        
                        C_comment_begin_symb_ind,                      
                        C_comment_begin_str_ind,                        
                        cur_state
                    );
                break;
 
            case  C_COMMENT_STATE:
                C_COMMENT_STATE_parse
                    (
                        s,
                        symb_ind,
                        str_ind,
                        C_comment_begin_symb_ind,                      
                        C_comment_begin_str_ind,                        
                        cur_state
                    );
                break;
 
            case  CPP_COMMENT_STATE:
                CPP_COMMENT_STATE_parse
                    (
                        s,
                        symb_ind,
                        cur_state
                    );
                break;
 
            case  SYMB_LITERAL_STATE:
                SYMB_LITERAL_STATE_parse
                    (
                        s,                        
                        symb_ind,
                        cur_state
                    );
                break;
 
            case  STR_LITERAL_STATE:
                STR_LITERAL_STATE_parse
                    (
                        s,
                        symb_ind,
                        cur_state
                    );
                break;
 
            case  ERROR_STATE:
                return  false;
            }//switch            
        }//for
    }//while
    return  cur_state == TEXT_STATE;
}
/////////////////////////////////////////////////////////////////////////////////////////
int main()
{    
    std::locale::global(std::locale(""));
    T_str   ifilename       =   "f.txt";
    bool    file_is_open    =   false; 
    bool    bool_res        =   C_comments_in_CPP_text_are_correct
                                    (
                                        ifilename,
                                        file_is_open
                                    );
 
    if( !file_is_open )
    {
        std::cout << "Невозможно открыть файл \""
                  << ifilename
                  << "\"."
                  << std::endl;    
    }
    else
    {
        std::cout << "В файле "
                  << ifilename
                  << " C-комментарии во фрагменте программы на C++"
                  << (bool_res ? "" : " НЕ")
                  << " корректны."
                  << std::endl;
    }    
}
3
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.10.2011, 11:00
Привет! Вот еще темы с ответами:

Проверить в тексте файла правильность расстановки открывающих и закрывающих скобок - C++
Помогите, пожалуйста написать программу C++ Дан текстовый файл INPUT.TXT. Проверить в тексте файла правильности расстановки открывающих и...

Проверить правильность расстановки и вложенности скобок в тексте (абстрактный стек) - C++
реализовать с помощью связного списка...

Проверить правильность расстановки в тексте круглых скобок (конечный автомат) - C++
Только начала изучать С++.Необходимо проверить правильность расстановки в тексте круглых скобок. Текст вводится с клавиатуры и...

Проверить правильность расстановки в тексте круглых скобок. Текст заканчивается точкой - C++
Работает,но неправильно. Сделала конечным автоматом. Помогите, пожалуйста! #include &lt;iostream&gt; #include &lt;string&gt; #include &lt;cmath&gt; ...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
22.10.2011, 11:00
Ответ Создать тему
Опции темы

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