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

Подскажите как исправить функцию - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Ошибка в инициализации базовых классов http://www.cyberforum.ru/cpp-beginners/thread919943.html
Привет. Пишу код из книги Лафоре. #include <iostream> using namespace std; #include <windows.h> enum posneg {pos, meg}; class Distance { protected: int feet;
C++ Как правильно описать функцию acos? И ребят помогите разобраться в чем ошибки здесь, делаю лабораторную по методу секущих И еще как можно графически выполнить метод секущих через Dos Box? Заранее благодарю за помощь #include... http://www.cyberforum.ru/cpp-beginners/thread919942.html
Сортировка массива по убыванию элементов C++
Скажите пожалуйста, что не так, если не так, в этом коде) Задание: отсортировать массив по убыванию значений элементов в строках и столбцах методом пузырька #include <iostream> #include <conio.h>...
Указание ключа компилятора для OpenMP C++
смотрю на сайте http://edu.chpc.ru/parallel/mainse4.html Для использования механизмов OpenMP нужно скомпилировать программу компилятором, поддерживающим OpenMP, с указанием соответствующего ключа...
C++ Работа с файлами (запись данных, сортировка) http://www.cyberforum.ru/cpp-beginners/thread919922.html
Здравствуйте, помогите пожалуйста с заданием: написать программу, которая запрашивает у пользователя имя, фамилию, дату рождения, номер группы, пол, рост, вес и записывает данные в файл. Программа...
C++ Нотация O большое Здорова! Есть задачка: "Изучите О() нотацию. Приведите реалистичный пример, в котором получается, что О(N*N) быстрее, чем О(N) для некоторых N>10." подробнее

Показать сообщение отдельно
xtorne21st
интересующийся
304 / 275 / 19
Регистрация: 25.09.2010
Сообщений: 1,056
11.07.2013, 01:20
При условии что -1, -2, -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
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
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
#include <iostream>
#include <list>
#include <cctype>
 
struct Token_error {};
struct Range_error {};
 
struct TNode
{
    TNode* left;
    TNode* right;
    int val;
 
    TNode(int v) : left(0), right(0) { val = v; }
    TNode(int v, TNode* l, TNode* r) : val(v), left(l), right(r) {}
};
 
typedef std::list<TNode*> Ln;
 
void makeTokensList(const char* line, Ln& emptyList)
{
    const char* p = line;
    while (*p)
    {
        switch (*p)
        {
        case '+':
            emptyList.push_back(new TNode(-1));
            break;
        case '-':
            emptyList.push_back(new TNode(-2));
            break;
        case '*':
            emptyList.push_back(new TNode(-3));
            break;
        default:
            if (isdigit(*p))
            {
                emptyList.push_back(new TNode(*p - '0'));
            }
            else if (isspace(*p))
            {
                ++p;
                continue;
            }
            else
            {
                throw Token_error();
            }
            break;
        }
        ++p;
    }
}
 
void showThis(TNode* v)
{
    std::cout << v->val << ' ';
    std::cout.flush();
}
 
TNode* tryLex(const char* line)
{
    // First part.
    Ln x;
    const char* p = line;
 
    while (*p)
    {
        switch (*p)
        {
        case '+':
            x.push_back(new TNode(-1));
            break;
        case '-':
            x.push_back(new TNode(-2));
            break;
        case '*':
            x.push_back(new TNode(-3));
            break;
        default:
            if (isdigit(*p))
            {
                x.push_back(new TNode(*p - '0'));
            }
            else if (isspace(*p))
            {
                ++p;
                continue;
            }
            else
            {
                throw Token_error();
            }
            break;
        }
        ++p;
    }
 
    // Second part.
    Ln::iterator it = x.begin();
    Ln::iterator tm = it;
    while (1 < x.size())
    {
        if ((*it)->val == -1 || (*it)->val == -2 || (*it)->val == -3)
        {
            tm = it; ++tm;
            Ln::iterator right_node = it;
            --right_node;
            Ln::iterator left_node = right_node;
            --left_node;
 
            if (right_node == x.begin())
            {
               throw Range_error();
            }
 
            (*it)->right = *right_node;
            (*it)->left = *left_node;
            x.erase(right_node);
            x.erase(left_node);
 
            it = x.begin();
            while (it != x.end() && it != tm)
            {
                ++it;
            }
        }
        else
        {
            ++it;
        }
    }
 
    return *x.begin();
}
 
void show(TNode* root)
{
    if (!root)
    {
        return;
    }
 
    show(root->left);
    std::cout << root->val << ' ';
    show(root->right);
}
 
int main()
{
    const char* parseLine = "5 6 7 + - 1 3 * +";
    TNode* root = tryLex(parseLine);
    show(root);
}
0
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru