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

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 20, средняя оценка - 4.90
Hardcore
4 / 4 / 0
Регистрация: 24.10.2010
Сообщений: 200
18.11.2010, 16:07     Лэйс на с++ #1
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;
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 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;
}
Ошибся. Не покатит это.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
rangerx
1908 / 1517 / 139
Регистрация: 31.05.2009
Сообщений: 2,876
18.11.2010, 17:34     Лэйс на с++ #22
Цитата Сообщение от Hardcore Посмотреть сообщение
{[()([]{})[]]({}{{}})}[] Yes
вот так вот?
у мнея вообще нет мыслей как это можно написать?
Через стек.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
18.11.2010, 17:50     Лэйс на с++ #23
Тут можно устроить счетчик для каждой скобки. Но мне кажется это будет слишком. Посему лучше воспользоваться советом rangerx
Hardcore
4 / 4 / 0
Регистрация: 24.10.2010
Сообщений: 200
18.11.2010, 17:51  [ТС]     Лэйс на с++ #24
можете привести пример стэкам?
volovzi
266 / 168 / 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;
}
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 ([())]
но выходит ошибка после компиляций.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
18.11.2010, 19:12     Лэйс на с++ #27
Hardcore, М. Обязательно вводить сколько символов?)
Просто string - динамически распределяет под себя память под кол-во символов которые введены.
jambas92
 Аватар для 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;
}
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4236 / 2769 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 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() . Индексировать можно заполненые строки.
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;
}
подкоректирву этот.
volovzi
266 / 168 / 8
Регистрация: 14.03.2010
Сообщений: 501
18.11.2010, 19:35     Лэйс на с++ #31
Цитата Сообщение от Hardcore Посмотреть сообщение
мне надо сначало написать количество символов которые я должен ввести.
Зачем?
Hardcore
4 / 4 / 0
Регистрация: 24.10.2010
Сообщений: 200
18.11.2010, 20:01  [ТС]     Лэйс на с++ #32
Это условие задачи.
Если можете помогите
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4236 / 2769 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
18.11.2010, 20:07     Лэйс на с++ #33
Напишите условия задания полностью, а то по обрывакам фраз полная картина не понятна. Я недавно парсер для калькулятора писал, там у меня есть обработка скобок, может подойдет. (причем сначала написал через string потом подумал и сделал по другому, но строковая версия на компе осталась )
Hardcore
4 / 4 / 0
Регистрация: 24.10.2010
Сообщений: 200
18.11.2010, 20:29  [ТС]     Лэйс на с++ #34
входные данные
6
([())] No

24
{[()([]{})[]]({}{{}})}[] Yes
volovzi
266 / 168 / 8
Регистрация: 14.03.2010
Сообщений: 501
18.11.2010, 20:44     Лэйс на с++ #35
Hardcore, я думаю, что ты что-то неправильно понял. Ввод длины строки с последующим посимвольным считыванием в данном случае — лишняя работа. А лишнюю работу делать не нужно.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
18.11.2010, 20:47     Лэйс на с++ #36
volovzi, Для использования char* понадобится.
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4236 / 2769 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
18.11.2010, 20:49     Лэйс на с++ #37
Цитата Сообщение от Kastaneda Посмотреть сообщение
Напишите условия задания полностью
Цитата Сообщение от Hardcore Посмотреть сообщение
входные данные
6
([())] No

24
{[()([]{})[]]({}{{}})}[] Yes
Это тест на интуицию? Нужно определить грамотно ли стоят скобки? А выше вы что-то про string писали? Потом выяснится, что нужно на С писать, а не на С++ )
Hardcore
4 / 4 / 0
Регистрация: 24.10.2010
Сообщений: 200
18.11.2010, 20:51  [ТС]     Лэйс на с++ #38
вот условия
Input
The first line contains the number of brackets - N (1 ≤ N ≤ 100 000).
The second contains the sequence of N symbols from the set (,) [,] {,}.
Output
Displays the word "Yes", if you can get a correct arithmetic expression, or "No", if you can not.
перевод.
ввод
первая линия содержить количество скобок.
второая линия содержит скобки.
вывод
надо вывести да если условия соблюдены, если нет то вывести нет.
volovzi
266 / 168 / 8
Регистрация: 14.03.2010
Сообщений: 501
18.11.2010, 20:59     Лэйс на с++ #39
Hardcore, да, задание дурацкое. В таком случае нужно не делать тупо и в лоб, а объяснить преподавателю, что можно сделать лучше.

P.S. А почему задание на "нерусском"?
Hardcore
4 / 4 / 0
Регистрация: 24.10.2010
Сообщений: 200
18.11.2010, 21:04  [ТС]     Лэйс на с++ #40
у нас типа международный универ. и все предметы идут на англ. вот так вот. а в лоб нельзя, я понимаю что так легче. просто он в контесторе ставит тесты (условия).

Добавлено через 1 минуту
Цитата Сообщение от Kastaneda Посмотреть сообщение
Это тест на интуицию? Нужно определить грамотно ли стоят скобки? А выше вы что-то про string писали? Потом выяснится, что нужно на С писать, а не на С++ )
всё надо писать на с++
Yandex
Объявления
18.11.2010, 21:04     Лэйс на с++
Ответ Создать тему
Опции темы

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