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

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

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

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

21.08.2012, 19:18. Просмотров 861. Ответов 13
Метки нет (Все метки)

меня терзают жудкие сомнения насчёт правильности выполнения

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

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()
{
}
она крашится. как исправить?
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.08.2012, 19:18
Здравствуйте! Я подобрал для вас темы с ответами на вопрос правильно ли я выполнил задание? (C++):

Правильно ли сделано задание - C++
Задание состоит в том что бы Определить является ли число k степенью 3. Не могли бы вы помочь объяснить в чем ошибка? # include...

Правильно ли выполнено задание - C++
Написать функцию, которая принимает на вход вектор строк и выводит их суммарную длину. #include &lt;iostream&gt; #include &lt;vector&gt; ...

правильно ли я сделал задание? - C++
правильно ли сделано задание? //предположим, что указатель pa был определен в следующем выражении с использованием оператора new. ...

Правильно ли сделано задание - C++
Нужно удалить максимальный элемент в массиве. Не могли бы вы помочь объяснить в чем ошибка? #include &lt;iostream.h&gt; #include &lt;conio.h&gt; ...

Как правильно выполнить задание? - C++
В программу должно вводиться предложение. Если предложение заканчивается пробелом с точкой, пишем &quot;да&quot; , иначе пишем &quot;нет&quot; string...

Можете сказать, я правильно понял задание? - C++
Вычислить сумму чисел в каждой строке. N&lt;=10, M&lt;=10 #include&lt;conio.h&gt; #include&lt;stdio.h&gt; #include&lt;stdlib.h&gt; #include&lt;time.h&gt; int...

13
novi4ok
551 / 504 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
21.08.2012, 19:26 #2
сложный ты метод выбрал. со стеком проще.

Добавлено через 1 минуту
кроме того, твой код скажет, что такая строчка правильная:
C++
1
}]])){[)[
количество совпадает, и все вроде хорошо, а на самом деле - ерудна.
1
salam
165 / 146 / 14
Регистрация: 10.07.2012
Сообщений: 738
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;
}
не тестировал - если какой баг, извиняйте...
1
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--;
 
}
0
Миниатюры
правильно ли я выполнил задание?  
salam
165 / 146 / 14
Регистрация: 10.07.2012
Сообщений: 738
21.08.2012, 19:59 #5
Вам же намекнули, что так воспитанные люди не пишут... Вы замучаетесь писать контролы для всех багов...
1
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--;
 
}
проверка работы программы в скринах внизу. вроде всё кому надо пользуйтесь.
0
Миниатюры
правильно ли я выполнил задание?   правильно ли я выполнил задание?   правильно ли я выполнил задание?  

I.M.
565 / 548 / 5
Регистрация: 16.12.2011
Сообщений: 1,389
21.08.2012, 20:07 #7
Хм, так теперь все ок? я просто что-то потерял нить разговора)
Если ок, то теперь можно начать совершенствовать программу. Например, сейчас, чтобы добавить новую пару скобок для парсинга (например <>) придется делать много копипаста в функции correctbrackets. А хотелось бы, чтобы достаточно было добавить эту пару в некий массив и всё само подхватилось...
1
KostyaKulakov
Заблокирован
21.08.2012, 20:13  [ТС] #8
Цитата Сообщение от I.M. Посмотреть сообщение
Хм, так теперь все ок? я просто что-то потерял нить разговора)
Если ок, то теперь можно начать совершенствовать программу. Например, сейчас, чтобы добавить новую пару скобок для парсинга (например <>) придется делать много копипаста в функции correctbrackets. А хотелось бы, чтобы достаточно было добавить эту пару в некий массив и всё само подхватилось...
нееее. по задание было сказанно только 3 вида скобов () [] {} я работу сделал ))
0
valeriikozlov
Эксперт С++
4670 / 2496 / 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 = '@';
        }
1
ForEveR
В астрале
Эксперт С++
7978 / 4737 / 321
Регистрация: 24.06.2010
Сообщений: 10,543
Завершенные тесты: 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/ef69a6245dd0836ff67abb5e17f681b9
1
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;
}
0
OhMyGodSoLong
~ Эврика! ~
1244 / 993 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
22.08.2012, 13:11 #12
И зачем все мутят стеки, когда можно обойтись просто тремя счётчиками и индикатором последней встреченной открывающей скобки?..

Фигню сморозил.
0
valeriikozlov
Эксперт С++
4670 / 2496 / 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;
1
b_kasenov47
14 / 14 / 1
Регистрация: 28.07.2012
Сообщений: 57
23.08.2012, 14:21 #14
Спасибо большое, косяк понял. Совсем забыл об этом случае, хота сам не недавно решал подобную задачу.
0
23.08.2012, 14:21
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.08.2012, 14:21
Привет! Вот еще темы с ответами:

Задание с матрицами! Не могу правильно настроить - C++
а)Двумерный массив размерностью 5 на 8 из целых элементов в диапазоне ; b) Найти максимальный элемент второй строки; с) Вычислить...

Проверьте пожалуйста, правильно ли я сделал задание - C++
Вот задание Дано действительное х. Вычислить \frac{(x-1)(x-3)(x-7)K(x-63)}{(x-2)(x-4)(x-8)K(x-64)} { {...

C++ | Правильно ли я сделал задание | Массивы | Указатели и Ссылки - C++
Вообще прога должна показывать самое большое число по модулю, что она и делает, но меня интересует другой вопрос, правильно ли я...

Компилятор не выполнил квинтиллион+ операций) - C++
Так уж получилось, что при написание программы пришлось использовать двадцатизначное число. И пересчитывать его. По единичке. Программа...


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

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

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