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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 20, средняя оценка - 4.90
Hardcore
4 / 4 / 0
Регистрация: 24.10.2010
Сообщений: 200
#1

Лэйс на с++ - C++

18.11.2010, 16:07. Просмотров 2502. Ответов 52
Метки нет (Все метки)

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
using namespace std;
int main () {
    int lays=0;
    char mas[1001];
    cin>>mas;
    for (int i=0; i<=strlen(mas);i++)
        if ('(')
        lays++;
    
    if ('(')
        lays--;
        cout<<"VALID"<<endl;
    
    if (lays==0)
        cout<<"INVALID"<<endl;
    
        return 0;
}
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Hardcore
4 / 4 / 0
Регистрация: 24.10.2010
Сообщений: 200
18.11.2010, 17:06  [ТС] #16
Forevor, по смотри в моем последнем коде ошибку.
ввод () валид
ввод )( инвалид.
ошибка такая ка бы я не вводил отвечает валид.
0
ForEveR
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
18.11.2010, 17:19 #17
Hardcore, Я уже сказал ошибку...
пробуй так.
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
#include <iostream>
using namespace std;
int main () {
        int lays=0;
        char mas[1001];
        cin>>mas;
        int len=strlen(mas);
        try
        {
        for (int i=0; i<len;i++)
        {
                if (mas[i]=='(')
                   lays++;
        
                else if (mas[i]==')')
                   lays--;
                if(lays<0)
                   throw std::logic_error("INVALID");
        }
        }
        catch(const std::exception& e)
        {
            std::cerr<<e.what()<<'\n';
            return 1;
        }
        if (lays==0)
                cout<<"VALID"<<endl;
        else
               cout<<"INVALID"<<endl;
        return 0;
}
1
fasked
Эксперт С++
4951 / 2531 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
18.11.2010, 17:20 #18
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
#include <iostream>
 
int main()
{
        std::string str;
        int lays = 0;
 
        std::cout << "< ";
        std::cin >> str;
 
        for(std::string::size_type i = 0; i < str.length(); ++i) {
                if(str[i] == '(')
                        ++lays;
                else if(str[i] == ')')
                        --lays;
 
                if(lays < 0)
                        break;
        }
 
        if(lays != 0)
                std::cout << "invalid" << std::endl;
        else
                std::cout << "valid" << std::endl;
 
        return 0;
}
1
volovzi
267 / 169 / 8
Регистрация: 14.03.2010
Сообщений: 501
18.11.2010, 17:21 #19
Придумал, как красиво учесть порядок поступления скобок: если счётчик становится меньше нуля, то это значит, что скобка закрылась без открытия, и цикл можно прекращать.

Добавлено через 36 секунд
Э, ребята, перемудрили вы:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
#include <string>
 
int main (int argc, char * const argv[]) {
    std::string string;
    int counter = 0;
    
    std::cin >> string;
    
    for (int i = 0; i < string.size() && counter >= 0; ++i) {
        if (string[i] == '(') ++counter;
        else if (string[i] == ')') --counter;
    }
    
    if (counter == 0) std::cout << "Скобки расставлены верно." << std::endl;
    else std::cout << "Скобки расставлены неверно." << std::endl;
 
    return 0;
}
1
Hardcore
4 / 4 / 0
Регистрация: 24.10.2010
Сообщений: 200
18.11.2010, 17:29  [ТС] #20
А если усложнить задачу.
6
([())] No

24
{[()([]{})[]]({}{{}})}[] Yes

вот так вот?
у мнея вообще нет мыслей как это можно написать?
0
ForEveR
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
18.11.2010, 17:32 #21
Hardcore, Скобки разные. Но суть одна и та же.

Добавлено через 1 минуту
Возьму за эталон код volovzi

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
#include <string>
 
int main (int argc, char * const argv[]) {
        std::string string;
        int counter = 0;
        
        std::cin >> string;
        
        for (int i = 0; i < string.size() && counter >= 0; ++i) {
                if (string[i] == '(' || string[i]=='[' || string[i]=='{') ++counter;
                else if (string[i] == ')' || string[i]==']' || string[i]=='}') --counter;
        }
        
        if (counter == 0) std::cout << "Скобки расставлены верно." << std::endl;
        else std::cout << "Скобки расставлены неверно." << std::endl;
 
        return 0;
}
Ошибся. Не покатит это.
0
rangerx
1937 / 1546 / 141
Регистрация: 31.05.2009
Сообщений: 2,913
18.11.2010, 17:34 #22
Цитата Сообщение от Hardcore Посмотреть сообщение
{[()([]{})[]]({}{{}})}[] Yes
вот так вот?
у мнея вообще нет мыслей как это можно написать?
Через стек.
1
ForEveR
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
18.11.2010, 17:50 #23
Тут можно устроить счетчик для каждой скобки. Но мне кажется это будет слишком. Посему лучше воспользоваться советом rangerx
1
Hardcore
4 / 4 / 0
Регистрация: 24.10.2010
Сообщений: 200
18.11.2010, 17:51  [ТС] #24
можете привести пример стэкам?
0
volovzi
267 / 169 / 8
Регистрация: 14.03.2010
Сообщений: 501
18.11.2010, 18:31 #25
Hardcore, идея в том, чтобы запоминать, какая скобка открылась последней, и запрещать закрывать "не свою" скобку (например, фигурную закрывать круглой).
Выглядеть это будет примерно так:
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 <stack>
 
bool is_opening_bracket (char symbol) { return symbol == '(' || symbol == '[' || symbol == '{'; }
bool is_closing_bracket (char symbol) { return symbol == ')' || symbol == ']' || symbol == '}'; }
 
bool brackets_are_relative (char opening_bracket, char closing_bracket) {
    return (
        opening_bracket == '(' && closing_bracket == ')' ||
        opening_bracket == '[' && closing_bracket == ']' ||
        opening_bracket == '{' && closing_bracket == '}'
    );
}
 
int main (int argc, char * const argv[]) {
    std::string string;
    std::stack<char> opening_brackets;
    bool ok = true;
    
    std::cin >> string;
    
    for (int i = 0; i < string.size() && ok; ++i) {
        if (is_opening_bracket(string[i])) {
            opening_brackets.push(string[i]);
        } else if (is_closing_bracket(string[i])) {
            if (!opening_brackets.empty() && brackets_are_relative(opening_brackets.top(), string[i])) opening_brackets.pop();
            else ok = false;
        }
    }
    
    if (opening_brackets.empty() && ok) std::cout << "Скобки расставлены верно." << std::endl;
    else std::cout << "Скобки расставлены неверно." << std::endl;
 
    return 0;
}
1
Hardcore
4 / 4 / 0
Регистрация: 24.10.2010
Сообщений: 200
18.11.2010, 19:01  [ТС] #26
ясно. такой момент.
мне надо сначало написать количество символов которые я должен ввести.
это в мэйне написать или в функций?

Добавлено через 16 минут
C++
1
2
3
4
int n;
        std::cin>>n;
        for (int i=0; i<n; i++)
        std::cin >> string[i];
я по пробывал написать так.
чтоб ввести это 6 ([())]
но выходит ошибка после компиляций.
0
ForEveR
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
18.11.2010, 19:12 #27
Hardcore, М. Обязательно вводить сколько символов?)
Просто string - динамически распределяет под себя память под кол-во символов которые введены.
0
jambas92
58 / 57 / 3
Регистрация: 18.11.2010
Сообщений: 315
18.11.2010, 19:18 #28
я здесь уже создал тему на счет этой задачи!!! Смотри Стек.Исправить ошибки(с++)

Добавлено через 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
43
44
45
46
47
48
49
50
51
52
53
54
55
#include <iostream>
#include<stack>
#include<queue>
#include<deque>
#include <string>
 
using namespace std;
 
int main()
{
    string mas;
    stack <string> st;
 
    int count=0;
    int n;
    
    cin >> n;
    cin >> mas;
 
    for (int i=0; i<n; i++)
    {
        if (mas[i]=='(' || mas[i]=='[' || mas[i]=='{')
        {
            st.push(mas[i]);
        }
        if (mas[i]==')')
        {
            if (st.top=='(')
            {
                st.pop();
            }
            if (st.top=='[')
            {
                st.pop();
            }
            if (st.top=='{')
            {
                st.pop();
            }
            else
            {
                count ++;
            }
        }
    }
    if (count==0)
    {
        cout << "yes";
    }
    else
    {
        cout << "no";
    }
    return 0;
}
0
Kastaneda
Jesus loves me
Эксперт С++
4697 / 2901 / 238
Регистрация: 12.12.2009
Сообщений: 7,385
Записей в блоге: 2
Завершенные тесты: 1
18.11.2010, 19:20 #29
C++
1
2
3
4
int n;
                std::cin>>n;
                for (int i=0; i<n; i++)
        std::cin >> string[i];
я по пробывал написать так.
чтоб ввести это 6 ([())]
но выходит ошибка после компиляций.
Hardcore, если вам так необходимо использовать string, то нужно использовать push_back() . Индексировать можно заполненые строки.
1
Hardcore
4 / 4 / 0
Регистрация: 24.10.2010
Сообщений: 200
18.11.2010, 19:23  [ТС] #30
Kastaneda, это условие задачи.
если можешь напиши код.
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 <stack>
 
bool is_opening_bracket (char symbol) { return symbol == '(' || symbol == '[' || symbol == '{'; }
bool is_closing_bracket (char symbol) { return symbol == ')' || symbol == ']' || symbol == '}'; }
 
bool brackets_are_relative (char opening_bracket, char closing_bracket) {
        return (
                opening_bracket == '(' && closing_bracket == ')' ||
                opening_bracket == '[' && closing_bracket == ']' ||
                opening_bracket == '{' && closing_bracket == '}'
        );
}
 
int main (int argc, char * const argv[]) {
        std::string string;
        std::stack<char> opening_brackets;
        bool ok = true;
        
        std::cin >> string;
        
        for (int i = 0; i < string.size() && ok; ++i) {
                if (is_opening_bracket(string[i])) {
                        opening_brackets.push(string[i]);
                } else if (is_closing_bracket(string[i])) {
                        if (!opening_brackets.empty() && brackets_are_relative(opening_brackets.top(), string[i])) opening_brackets.pop();
                        else ok = false;
                }
        }
        
        if (opening_brackets.empty() && ok) std::cout << "Скобки расставлены верно." << std::endl;
        else std::cout << "Скобки расставлены неверно." << std::endl;
 
        return 0;
}
подкоректирву этот.
0
18.11.2010, 19:23
Ответ Создать тему
Опции темы

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