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

правильно ли я выполнил задание? - C++

Восстановить пароль Регистрация
 
KostyaKulakov
Заблокирован
21.08.2012, 19:18     правильно ли я выполнил задание? #1
меня терзают жудкие сомнения насчёт правильности выполнения

Исходный код программы на С++ обычно содержит много пар круглых,
квадратных и фигурных скобок. Если не обращать внимания на всё прочее
содержимое программы, то эти три вида скобок должны образовывать правильное
скобочное выражение. Написать программу, которой на вход подаётся исходный
код программы на С++ и которая обнаруживает проблемы в расстановке скобок.
Упрощающие обстоятельства: можно считать, что программа не содержит
комментариев или в них не используются скобки, и что скобки не встречаются
внутри строковых и символьных литералов.

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
#include <iostream>
#include <cstring>
 
using namespace std;
 
bool correctbrackets(char brackets[]);
 
int main()
{
    char brackets[500];
    bool correct = false;
    cout << "Enter an expression with parentheses [ End[`] ] : " << endl;
 
    while( brackets[(strlen(brackets)-1)] != *"`")
    {
        cin >> brackets;
 
        if (!correctbrackets(brackets))
        {
            cout << endl <<"Error. source code incorrectly!" << endl;
            return 0;
        }
        else
        correct = true;
 
    }
 
    if(correct)
        cout << endl << "very well"  << endl;
 
    return 0;
}
 
bool correctbrackets(char brackets[])
{
    char end_open_skobka = '@';           // последняя открывающая скобка
    char stack[80];
    int pos = -1;
 
    int round, figured, squared;
 
    round = figured = squared = 0;
 
    for(int i=0; i < strlen(brackets)+1; i++)
    {
        if(brackets[i] == '(')
            round++;
 
        if(brackets[i] == ')')
            round--;
 
        if (brackets[i] == '{') 
            figured++;
 
        if (brackets[i] == '}') 
            figured--;
 
        if (brackets[i] == '[') 
            squared++;  
 
        if (brackets[i] == ']') 
            squared--; 
 
        if ( brackets[i] == '(' || 
             brackets[i] == '{' ||
             brackets[i] == '[' )
        {
            end_open_skobka = brackets[i];          
            pos++;                     
            stack[pos] = brackets[i];         
        }
 
            if (  brackets[i] == ')' && end_open_skobka != '('  ||
                  brackets[i] == '}' && end_open_skobka != '{'  ||
                  brackets[i] == ']' && end_open_skobka != '[' )
            break;
 
        if ( brackets[i] == ')' || brackets[i] == '}' || brackets[i] == ']' )
        {
            pos--;                           
            if (pos >= 0)
                end_open_skobka = stack[pos];
        }
    }
 
    if (round || figured || squared)
        return false;
    else
        return true;
 
}
программа отлично всё обрабатывает. за исключением
C++
1
2
3
int main()
{
}
она крашится. как исправить?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.08.2012, 19:18     правильно ли я выполнил задание?
Посмотрите здесь:

C++ правильно ли я сделал задание?
C++ Проверьте пожалуйста, правильно ли я сделал задание
C++ Правильно ли выполнено задание
C++ Правильно ли сделано задание
C++ Правильно ли сделано задание
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
novi4ok
549 / 502 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
21.08.2012, 19:26     правильно ли я выполнил задание? #2
сложный ты метод выбрал. со стеком проще.

Добавлено через 1 минуту
кроме того, твой код скажет, что такая строчка правильная:
C++
1
}]])){[)[
количество совпадает, и все вроде хорошо, а на самом деле - ерудна.
salam
157 / 138 / 11
Регистрация: 10.07.2012
Сообщений: 709
21.08.2012, 19:48     правильно ли я выполнил задание? #3
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
#include <deque>
#include <string>
#include <iostream>
using namespace std;
 
int main()
{
    string str;
    deque <char> d;
    getline(cin, str);
    for(size_t i=0; i < str.length(); i++)
        switch(str[i])
        {
        case(')'):
            if(d.back() == '(')
                d.pop_back();
            else
                d.push_back(str[i]);
            break;
        case(']'):
            if(d.back() == '[')
                d.pop_back();
            else
                d.push_back(str[i]);
            break;
        case('}'):
            if(d.back() == '{')
                    d.pop_back();
            else
                d.push_back(str[i]);
            break;
     default:
         if(str[i] == '(' || str[i] == '[' || str[i] == '{')
                     d.push_back(str[i]);
        }
    if(d.empty())
        cout << "OK" << endl;
    else
        cout << "NO" << endl;
    system("pause");
    return 0;
}
не тестировал - если какой баг, извиняйте...
KostyaKulakov
Заблокирован
21.08.2012, 19:57  [ТС]     правильно ли я выполнил задание? #4
Цитата Сообщение от novi4ok Посмотреть сообщение
сложный ты метод выбрал. со стеком проще.

Добавлено через 1 минуту
кроме того, твой код скажет, что такая строчка правильная:
C++
1
}]])){[)[
количество совпадает, и все вроде хорошо, а на самом деле - ерудна.
кстате я реализовал проверку на это. вот смотрите:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
    while( brackets[(strlen(brackets)-1)] != *"`")
    {
        cin >> brackets;
 
        control(brackets, cont);
 
        if (!correctbrackets(brackets) && strlen(brackets) > 1) //strlen(brackets) > 1 я незнаю как исправить но если пользователь введёт одиночный { то программа вернёт некоректность а так быть не должно по этому лучше отключю проверку.
        {                                                               //int main()
            cout << endl <<"Error. source code incorrectly!" << endl;   //{
            return 0;                                                   // и программа крашится по этому и отключил (( при этом сделал новую проверку и теперь всё работает на ура :)
        }
        else
        correct = true;
 
    }
 
    if(correct && cont == 0)
        cout << endl << "very well"  << cont << endl;
    else
        cout << endl <<"Error. source code incorrectly!" << endl;
функция control:
C++
1
2
3
4
5
6
7
8
9
10
void control(char brackets[], int &cont)
{
 
        if(*brackets == *"(" || *brackets == *"{" || *brackets == *"[")
            cont++;
 
        if(*brackets == *")" || *brackets == *"}" || *brackets == *"]")
            cont--;
 
}
Миниатюры
правильно ли я выполнил задание?  
salam
157 / 138 / 11
Регистрация: 10.07.2012
Сообщений: 709
21.08.2012, 19:59     правильно ли я выполнил задание? #5
Вам же намекнули, что так воспитанные люди не пишут... Вы замучаетесь писать контролы для всех багов...
KostyaKulakov
Заблокирован
21.08.2012, 20:00  [ТС]     правильно ли я выполнил задание? #6
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
#include <iostream>
#include <cstring>
 
using namespace std;
 
bool correctbrackets(char brackets[]);
void control(char brackets[], int &cont);
 
int main()
{
    char brackets[500];
    bool correct = false;
    int cont = 0;
    cout << "Enter an expression with parentheses [ End[`] ] : " << endl;
 
    while( brackets[(strlen(brackets)-1)] != *"`")
    {
        cin >> brackets;
 
        control(brackets, cont);
 
        if (!correctbrackets(brackets) && strlen(brackets) > 1) //strlen(brackets) > 1 я незнаю как исправить но если пользователь введёт одиночный { то программа вернёт некоректность а так быть не должно по этому лучше отключю проверку.
        {                                                               //int main()
            cout << endl <<"Error. source code incorrectly!" << endl;   //{
            return 0;                                                   // и программа крашится по этому и отключил (( при этом сделал новую проверку и теперь всё работает на ура :)
        }
        else
        correct = true;
 
    }
 
    if(correct && cont == 0)
        cout << endl << "very well"  << cont << endl;
    else
        cout << endl <<"Error. source code incorrectly!" << endl;   
 
    return 0;
}
 
bool correctbrackets(char brackets[])
{
    char end_open_skobka = '@';           // последняя открывающая скобка
    char stack[80];
    int pos = -1;
 
    int round, figured, squared;
 
    round = figured = squared = 0;
 
    for(int i=0; i < strlen(brackets)+1; i++)
    {
        if(brackets[i] == '(')
            round++;
 
        if(brackets[i] == ')')
            round--;
 
        if (brackets[i] == '{') 
            figured++;
 
        if (brackets[i] == '}') 
            figured--;
 
        if (brackets[i] == '[') 
            squared++;  
 
        if (brackets[i] == ']') 
            squared--; 
 
        if ( brackets[i] == '(' || 
             brackets[i] == '{' ||
             brackets[i] == '[' )
        {
            end_open_skobka = brackets[i];          
            pos++;                     
            stack[pos] = brackets[i];         
        }
 
            if (  brackets[i] == ')' && end_open_skobka != '('  ||
                  brackets[i] == '}' && end_open_skobka != '{'  ||
                  brackets[i] == ']' && end_open_skobka != '[' )
            break;
 
        if ( brackets[i] == ')' || brackets[i] == '}' || brackets[i] == ']' )
        {
            pos--;                           
            if (pos >= 0)
                end_open_skobka = stack[pos];
        }
    }
 
    if (round || figured || squared)
        return false;
    else
        return true;
 
}
 
void control(char brackets[], int &cont)
{
 
        if(*brackets == *"(" || *brackets == *"{" || *brackets == *"[")
            cont++;
 
        if(*brackets == *")" || *brackets == *"}" || *brackets == *"]")
            cont--;
 
}
проверка работы программы в скринах внизу. вроде всё кому надо пользуйтесь.
Миниатюры
правильно ли я выполнил задание?   правильно ли я выполнил задание?   правильно ли я выполнил задание?  

I.M.
 Аватар для I.M.
564 / 547 / 5
Регистрация: 16.12.2011
Сообщений: 1,389
21.08.2012, 20:07     правильно ли я выполнил задание? #7
Хм, так теперь все ок? я просто что-то потерял нить разговора)
Если ок, то теперь можно начать совершенствовать программу. Например, сейчас, чтобы добавить новую пару скобок для парсинга (например <>) придется делать много копипаста в функции correctbrackets. А хотелось бы, чтобы достаточно было добавить эту пару в некий массив и всё само подхватилось...
KostyaKulakov
Заблокирован
21.08.2012, 20:13  [ТС]     правильно ли я выполнил задание? #8
Цитата Сообщение от I.M. Посмотреть сообщение
Хм, так теперь все ок? я просто что-то потерял нить разговора)
Если ок, то теперь можно начать совершенствовать программу. Например, сейчас, чтобы добавить новую пару скобок для парсинга (например <>) придется делать много копипаста в функции correctbrackets. А хотелось бы, чтобы достаточно было добавить эту пару в некий массив и всё само подхватилось...
нееее. по задание было сказанно только 3 вида скобов () [] {} я работу сделал ))
valeriikozlov
Эксперт C++
 Аватар для valeriikozlov
4660 / 2486 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
22.08.2012, 06:11     правильно ли я выполнил задание? #9
Цитата Сообщение от KostyaKulakov Посмотреть сообщение
я работу сделал
есть прокол на тесте:
())(
можно сделать так:
Цитата Сообщение от KostyaKulakov Посмотреть сообщение
C++
1
2
3
4
5
6
if ( brackets[i] == ')' || brackets[i] == '}' || brackets[i] == ']' )
 {
 pos--; 
 if (pos >= 0)
 end_open_skobka = stack[pos];
 }
заменить на:
C++
1
2
3
4
5
6
7
8
        if ( brackets[i] == ')' || brackets[i] == '}' || brackets[i] == ']' )
        {
            pos--;                           
            if (pos >= 0)
                end_open_skobka = stack[pos];
            else
                end_open_skobka = '@';
        }
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
22.08.2012, 09:44     правильно ли я выполнил задание? #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
#include <iostream>
#include <string>
#include <deque>
#include <algorithm>
 
int main()
{
   const std::string l_brackets = "([<{";
   const std::string r_brackets = ")]>}";
   const std::string test_s = "(<[{}[{}([])]]([<>])>)";
   
   std::deque<char> brackets;
   auto find = [](const std::string& s, char c) { return std::find(s.begin(), s.end(), c); };
   auto pos = test_s.begin();
   for (; pos != test_s.end(); ++pos)
   {
      if (find(l_brackets, *pos) != l_brackets.end())
      {
         brackets.push_back(*pos);
      }
      else
      {
         auto r_pos = find(r_brackets, *pos);
         if (r_pos != r_brackets.end())
         {
            auto c_pos = std::find(brackets.begin(), brackets.end(), l_brackets[r_pos - r_brackets.begin()]);
            if (c_pos == brackets.end())
            {
               break;
            }
            brackets.pop_back();
         }
      }
   }
   std::cout << "Expression is right: " << std::boolalpha << (pos == test_s.end() && brackets.empty()) << std::endl;
}
http://liveworkspace.org/code/ef69a6...7abb5e17f681b9
b_kasenov47
14 / 14 / 1
Регистрация: 28.07.2012
Сообщений: 57
22.08.2012, 12:33     правильно ли я выполнил задание? #11
У меня получилась такая вот реализация:
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
#include <iostream>
#include <string>
#include <stack>
 
using namespace std;
 
bool check(char c1, char c2);
//Проверка соответствия скобок
 
int main()
{
    cout << "Enter an expression with parentheses [ End[`] ] : " << endl;
    string s;
    stack <char> st; //Стэк для скобок
    do
        {
            cin >> s;
            for (int i = 0; i < s.size(); i++)
                {
                    if (s[i] == '(' || s[i] == '[' || s[i] == '{')
                        st.push(s[i]);//Если скобка открывающаяся - кладем ее в стэк
                    if (s[i] == ')' || s[i] == ']' || s[i] == '}')
//Если закрывающаяся - берем последнюю скобку из стэка и проверяем их
                        {
                            if (st.empty())//Если стэк пуст, но скобка закрывается - скобочное выражение неверно
                                {
                                    cout << endl <<"Error. source code incorrectly!" << endl;   
                                    return 0;
                                }
 
                            char k = st.top();
                            st.pop();
                            if (!check(k, s[i]))
                                {
                                    cout << endl <<"Error. source code incorrectly!" << endl;   
                                    return 0;
                                }
                        }
                }
        }
    while (s[s.size() - 1] != '`');
    cout << "very well" << endl;
    return 0;   
}
 
bool check(char c1, char c2)
{
    if (c1 == '(' && c2 == ')')
        return true;
    if (c1 == '[' && c2 == ']')
        return true;
    if (c1 == '{' && c2 == '}')
        return true;
    return false;
}
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
22.08.2012, 13:11     правильно ли я выполнил задание? #12
И зачем все мутят стеки, когда можно обойтись просто тремя счётчиками и индикатором последней встреченной открывающей скобки?..

Фигню сморозил.
valeriikozlov
Эксперт C++
 Аватар для valeriikozlov
4660 / 2486 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
22.08.2012, 16:04     правильно ли я выполнил задание? #13
b_kasenov47, есть прокол в коде, для строк вроде таких:
(((`
для исправления можно так:
Цитата Сообщение от b_kasenov47 Посмотреть сообщение
C++
1
2
while (s[s.size() - 1] != '`');
 cout << "very well" << endl;
заменить на:
C++
1
2
3
4
5
6
7
    while (s[s.size() - 1] != '`');
    if(!st.empty())
    {
        cout << endl <<"Error. source code incorrectly!" << endl;   
        return 0;
    }
    cout << "very well" << endl;
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.08.2012, 14:21     правильно ли я выполнил задание?
Еще ссылки по теме:

Можете сказать, я правильно понял задание? C++
Как правильно выполнить задание? C++

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

Или воспользуйтесь поиском по форуму:
b_kasenov47
14 / 14 / 1
Регистрация: 28.07.2012
Сообщений: 57
23.08.2012, 14:21     правильно ли я выполнил задание? #14
Спасибо большое, косяк понял. Совсем забыл об этом случае, хота сам не недавно решал подобную задачу.
Yandex
Объявления
23.08.2012, 14:21     правильно ли я выполнил задание?
Ответ Создать тему
Опции темы

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