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

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

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

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

18.11.2010, 16:07. Просмотров 2406. Ответов 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;
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ForEveR
В астрале
Эксперт С++
7968 / 4730 / 320
Регистрация: 24.06.2010
Сообщений: 10,539
Завершенные тесты: 3
18.11.2010, 21:23     Лэйс на с++ #41
На самом деле в лоб это вот так.
Хотя это тоже не тащит.

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 <iostream>
#include <string>
 
int main (int argc, char * const argv[]) {
        std::string string;
        int counter_round_br = 0;
        int counter_square_br = 0;
        int counter_fig_br=0;
        std::cin >> string;
        
        for (int i = 0; i < string.size() && counter_round_br >= 0 
            && counter_square_br>=0 && counter_fig_br>=0; ++i) {
                switch(string[i])
                {
                    case '(' :
                       counter_round_br++;
                       break;
                    case ')' :
                       counter_round_br--;
                       break;
                    case '[' :
                       counter_square_br++;
                       break;
                    case ']' :
                       counter_square_br--;
                       break;
                    case '{' :
                       counter_fig_br++;
                       break;
                    case '}' :
                       counter_fig_br--;
                       break;
                }
        }
        
        if (counter_round_br == 0 &&
            counter_square_br == 0 &&
            counter_fig_br==0) std::cout << "Скобки расставлены верно." << std::endl;
        else std::cout << "Скобки расставлены неверно." << std::endl;
 
        return 0;
}
volovzi
267 / 169 / 8
Регистрация: 14.03.2010
Сообщений: 501
18.11.2010, 21:30     Лэйс на с++ #42
Hardcore, просто интересно, а где ты учишься?
И что такое контестор?
Kastaneda
Форумчанин
Эксперт С++
4479 / 2841 / 226
Регистрация: 12.12.2009
Сообщений: 7,222
Записей в блоге: 1
Завершенные тесты: 1
18.11.2010, 21:34     Лэйс на с++ #43
ForEveR, не, вот такую строку разберет не правильно: "([)]" Выдаст true, хотя ответ false.
Hardcore
4 / 4 / 0
Регистрация: 24.10.2010
Сообщений: 200
18.11.2010, 21:35  [ТС]     Лэйс на с++ #44
я учусь в IITU.kz
а задачи кидаем в контестор http://contester.iitu.kz
ForEveR, там после того как ты вводишь 1-ую строку сразу выводит yes.
Kastaneda
Форумчанин
Эксперт С++
4479 / 2841 / 226
Регистрация: 12.12.2009
Сообщений: 7,222
Записей в блоге: 1
Завершенные тесты: 1
18.11.2010, 21:49     Лэйс на с++ #45
Я думаю алгоритм такой: находим ближние скобки одного типа, если между ними есть скобка (скобки) то значит они стоят не правильно, если нет, то удаляем эти скобки из строки и повторяем процедуру.
Можно даже сделать рекурсию. Я парсер для калькулятора именно так писал, но у меня там работа только с круглыми скобками.

Добавлено через 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
vector<int>Lbr;
    vector<int>Rbr;
    int len=(int)strlen(S);
    for(int i=0;i<len;i++){//находим скобки
        if(S[i]=='('){
            Lbr.push_back(i);}
        if(S[i]==')')
            Rbr.push_back(i);
    }
    if(Lbr.size()!=Rbr.size())
        //myerror(1);//
    int min=(Rbr.at((int)Rbr.size()-1)-Lbr.at(0));
    int rbr=Rbr.at((int)Rbr.size()-1);
    int lbr=Lbr.at(0);
    for(int i=0;i<(int)Rbr.size();i++) { //находим самые ближние скобки
        for(int j=0;j<(int)Rbr.size();j++)
        if(min>(Rbr.at(i)-Lbr.at(j))&&((Rbr.at(i)-Lbr.at(j))>0)){
            min=Rbr.at(i)-Lbr.at(j);
            lbr=Lbr.at(j);
            rbr=Rbr.at(i);
            
        }
    }
        cout<<"Blizhnie skobki na mestah "<<lbr+1<<" i "<<rbr+1<<endl;
- находит самые ближние скобки в строке. Может немного замудрено, но работает))
Hardcore
4 / 4 / 0
Регистрация: 24.10.2010
Сообщений: 200
18.11.2010, 21:50  [ТС]     Лэйс на с++ #46
напиши) главное чтоб сначало количество скобок а потом ввод скобок.
volovzi
267 / 169 / 8
Регистрация: 14.03.2010
Сообщений: 501
18.11.2010, 22:16     Лэйс на с++ #47
Hardcore, попробуй сам, что ли, пошевелиться. Тебе уже написали несколько рабочих вариантов. Подредактируй под себя.
Hardcore
4 / 4 / 0
Регистрация: 24.10.2010
Сообщений: 200
18.11.2010, 22:18  [ТС]     Лэйс на с++ #48
Пробовал.
ввожу цифру, потом скобки, а потом прерываться и выводит error.
volovzi
267 / 169 / 8
Регистрация: 14.03.2010
Сообщений: 501
18.11.2010, 22:25     Лэйс на с++ #49
Ну да, если "выводит error", то, пожалуй, ничего не поделаешь. Придётся бросать программирование.
Hardcore
4 / 4 / 0
Регистрация: 24.10.2010
Сообщений: 200
18.11.2010, 22:27  [ТС]     Лэйс на с++ #50
смешно) да дело не в этом. просто не вышло решил спросить тут на форуме помощь.
они подкидывают идеи, я пробую.
NightmareZ
1339 / 562 / 37
Регистрация: 31.03.2009
Сообщений: 1,918
19.11.2010, 00:21     Лэйс на с++ #51
Ну вы жжоте, "программисты"

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
#include <iostream>
#include <string>
#include <map>
#include <stack>
 
class Brackets
{
private:
    std::map<char, char> _bkts;
 
    Brackets()
    {
        _bkts['('] = ')';
        _bkts['['] = ']';
        _bkts['{'] = '}';
    }
public:
    static Brackets& getInstance()
    {
        static Brackets brackets;
        return brackets;
    }
 
    bool IsLeftBracket(char c)
    {
        return _bkts.find(c) != _bkts.end();
    }
 
    bool IsRightBracket(char c)
    {
        for (std::map<char, char>::iterator it = _bkts.begin(); it != _bkts.end(); it++)
            if (it->second == c)
                return true;
 
        return false;
    }
 
    bool IsPair(char first, char second)
    {
        return _bkts.find(first) != _bkts.end() && _bkts[first] == second;
    }
};
 
int main()
{
    std::string source;
    std::cin >> source;
 
    bool ok = true;
    std::stack<char> stck;
 
    for (std::string::iterator it = source.begin(); it != source.end(); it++)
    {
        if (Brackets::getInstance().IsLeftBracket(*it))
            stck.push(*it);
        else if (Brackets::getInstance().IsRightBracket(*it))
        {
            if (stck.empty())
            {
                std::cout << "Empty stack. Invalid bracket: " << *it << std::endl;
                ok = false;
                break;
            }
            else if (Brackets::getInstance().IsPair(stck.top(), *it))
            {
                stck.pop();
            }
            else
            {
                std::cout << "Invalid pair: " << stck.top() 
                       << " and " << *it << std::endl;
                stck.pop();
                ok = false;
                break;
            }
        }
    }
 
    if (ok)
    {
        if (!stck.empty())
            std::cout << "Stack not empty!" << std::endl;
        else
            std::cout << "OK!" << std::endl;
    }
 
    return 0;
}
volovzi
267 / 169 / 8
Регистрация: 14.03.2010
Сообщений: 501
19.11.2010, 01:02     Лэйс на с++ #52
NightmareZ, если имеешь смелость других в кавычки заключать, то вот тебе повод для размышления:
"Синглтон" твой на самом деле не синглтон, потому что не запрещён конструктор копирования. К тому же работа с синглтоном через "getInstance" — дурной тон. Нужно оборачивать вызовы в статические методы.
Далее, если работа со строковыми итераторами ещё вопрос спорный (тебе, конечно же, известно, что строковые итераторы имеют очень ограниченную область применения), то использование постфиксного инкремента — одназначная лажа.
Ну и, наконец, совершенно неинформативные сообщения. Пользователю пофиг на стек, ему нужно знать, какие данные он ввёл неправильно, и как эту ситуацию исправить.
NightmareZ
1339 / 562 / 37
Регистрация: 31.03.2009
Сообщений: 1,918
19.11.2010, 04:29     Лэйс на с++ #53
Цитата Сообщение от volovzi Посмотреть сообщение
NightmareZ, если имеешь смелость других в кавычки заключать, то вот тебе повод для размышления:
Да, сделай это, придирись к мелочам

Цитата Сообщение от volovzi Посмотреть сообщение
"Синглтон" твой на самом деле не синглтон, потому что не запрещён конструктор копирования. К тому же работа с синглтоном через "getInstance" — дурной тон. Нужно оборачивать вызовы в статические методы.
Я рад за тебя, что ты разглядел где-то там синглетон, а также рад, что ты знаешь этот паттерн, но какбэ я и не собирался синглетон делать. Мне нужно было две вещи: удобная инициализация map и несколько функций для работы с ним, что я и сделал. А то, что это не вписалось в рамки твоего мировозрения - могу лишь пособолезновать.

Да, я мог бы использовать список инициализации, но подумал, что целевой компилятор вполне может их не поддерживать, потому не стал.

Цитата Сообщение от volovzi Посмотреть сообщение
Далее, если работа со строковыми итераторами ещё вопрос спорный (тебе, конечно же, известно, что строковые итераторы имеют очень ограниченную область применения)
Развивай мысль, я тебя плохо понимаю. Только, плиз, о том, что касается непосредственно задачи, а не какие-нить неоретические измышления, как было выше по поводу паттернов.

Цитата Сообщение от volovzi Посмотреть сообщение
то использование постфиксного инкремента — одназначная лажа.
С этим соглашусь.

Цитата Сообщение от volovzi Посмотреть сообщение
Ну и, наконец, совершенно неинформативные сообщения. Пользователю пофиг на стек, ему нужно знать, какие данные он ввёл неправильно, и как эту ситуацию исправить.
Говорят, когда не к чему особо придраться, придираются к пунктуации, грамматике и "неинформативным сообщениям".
Yandex
Объявления
19.11.2010, 04:29     Лэйс на с++
Ответ Создать тему
Опции темы

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