Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.57/7: Рейтинг темы: голосов - 7, средняя оценка - 4.57
 Аватар для KostyaKulakov
64 / 52 / 2
Регистрация: 02.07.2012
Сообщений: 391
Записей в блоге: 2

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

21.08.2012, 19:18. Показов 1574. Ответов 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
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
21.08.2012, 19:18
Ответы с готовыми решениями:

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

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

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

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

Добавлено через 1 минуту
кроме того, твой код скажет, что такая строчка правильная:
C++
1
}]])){[)[
количество совпадает, и все вроде хорошо, а на самом деле - ерудна.
1
194 / 174 / 30
Регистрация: 10.07.2012
Сообщений: 800
21.08.2012, 19:48
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
64 / 52 / 2
Регистрация: 02.07.2012
Сообщений: 391
Записей в блоге: 2
21.08.2012, 19:57  [ТС]
Цитата Сообщение от 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
194 / 174 / 30
Регистрация: 10.07.2012
Сообщений: 800
21.08.2012, 19:59
Вам же намекнули, что так воспитанные люди не пишут... Вы замучаетесь писать контролы для всех багов...
1
 Аватар для KostyaKulakov
64 / 52 / 2
Регистрация: 02.07.2012
Сообщений: 391
Записей в блоге: 2
21.08.2012, 20:00  [ТС]
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.
576 / 559 / 47
Регистрация: 16.12.2011
Сообщений: 1,389
21.08.2012, 20:07
Хм, так теперь все ок? я просто что-то потерял нить разговора)
Если ок, то теперь можно начать совершенствовать программу. Например, сейчас, чтобы добавить новую пару скобок для парсинга (например <>) придется делать много копипаста в функции correctbrackets. А хотелось бы, чтобы достаточно было добавить эту пару в некий массив и всё само подхватилось...
1
 Аватар для KostyaKulakov
64 / 52 / 2
Регистрация: 02.07.2012
Сообщений: 391
Записей в блоге: 2
21.08.2012, 20:13  [ТС]
Цитата Сообщение от I.M. Посмотреть сообщение
Хм, так теперь все ок? я просто что-то потерял нить разговора)
Если ок, то теперь можно начать совершенствовать программу. Например, сейчас, чтобы добавить новую пару скобок для парсинга (например <>) придется делать много копипаста в функции correctbrackets. А хотелось бы, чтобы достаточно было добавить эту пару в некий массив и всё само подхватилось...
нееее. по задание было сказанно только 3 вида скобов () [] {} я работу сделал ))
0
Эксперт С++
 Аватар для valeriikozlov
4728 / 2549 / 757
Регистрация: 18.08.2009
Сообщений: 4,568
22.08.2012, 06:11
Цитата Сообщение от 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
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
22.08.2012, 09:44
Я бы сделал как-нибудь так...
Особо не тестировал.

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/... 5e17f681b9
1
14 / 14 / 3
Регистрация: 28.07.2012
Сообщений: 57
22.08.2012, 12:33
У меня получилась такая вот реализация:
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
1258 / 1007 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
22.08.2012, 13:11
И зачем все мутят стеки, когда можно обойтись просто тремя счётчиками и индикатором последней встреченной открывающей скобки?..

Фигню сморозил.
0
Эксперт С++
 Аватар для valeriikozlov
4728 / 2549 / 757
Регистрация: 18.08.2009
Сообщений: 4,568
22.08.2012, 16:04
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
14 / 14 / 3
Регистрация: 28.07.2012
Сообщений: 57
23.08.2012, 14:21
Спасибо большое, косяк понял. Совсем забыл об этом случае, хота сам не недавно решал подобную задачу.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
23.08.2012, 14:21
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru