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

Неизвестная функция - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 16, средняя оценка - 4.69
Sh0cK
0 / 0 / 0
Регистрация: 28.10.2012
Сообщений: 58
10.01.2013, 23:02     Неизвестная функция #1
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
#include "std_lib_facilities.h"
 
class Token {
public:
        char kind;
        double value;
        Token(char ch)
                :kind(ch), value(0) {}
        Token(char ch, double val)
                :kind(ch), value(val) {}
};
 
Token get_token();
vector<Token> tok;
 
int main()
{
while(cin){
    Token t = get_token();
    tok.push_back(t);
}
for (int i=0; i<tok.size(); ++i){
    if (tok[i].kind=='*'){
            double d=tok[i-1].value*tok[i+1].value;
            }
        }
 
    return 0;
}
Проблема вот в чем: учу С++ по книге Страуструпа и в результате наткнулся на этот отрезок кода (он был в примерах Страуструпа). Он в общем-то не делает то что от негот требуют но у меня вопрос другой: что за функция get_token() она мне до этих пор не встречалась и я не понимаю в чем она заключается и зачем перед этой функцией название класса?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.01.2013, 23:02     Неизвестная функция
Посмотрите здесь:

C++ неизвестная функция
Неизвестная конструкция C++
C++ неизвестная ошибка
Неизвестная функция. Книга. Страуструп C++
C++ Неизвестная ошибка с++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Avazart
 Аватар для Avazart
6893 / 5133 / 250
Регистрация: 10.12.2010
Сообщений: 22,560
Записей в блоге: 17
11.01.2013, 02:15     Неизвестная функция #21
В коде который я приводил в enum Token_value ( curr_tok ) хранится текущее состояние(что делать со значениями) а значения в number_value и string_value соответственно их типу.

Добавлено через 1 минуту
Цитата Сообщение от Sh0cK Посмотреть сообщение
Слова хранить не нужно(это калькулятор), а знаки в переменной типа char, а потом согласно программе переписать в вектор типа Token
А если sin() или pi (=3.14) ?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ValeryS
Модератор
6373 / 4839 / 440
Регистрация: 14.02.2011
Сообщений: 16,038
11.01.2013, 02:16     Неизвестная функция #22
Цитата Сообщение от Sh0cK Посмотреть сообщение
до сих пор я думал что каждый блок case должен заканчиватся оператором break,
нет
это по моему называется провяливанием
например нужно если нечетное число присвоить 0 а если четное 1 числа от 0 до 7
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
switch(i)
{
case 0:
case 2:
case 4:
case 6:
       n=1;
      break;
case 1:
case 3:
case 5:
case 7:
    n=0;
}
или если число на входе 1 надо удвоить а если 0 то вернуть 2
C++
1
2
3
4
5
6
7
switch(i)
{
  case 0:
      i++;
  case 1:
     i*=2; 
}
примеры надуманные, в жизни решаются по другому, это просто чтобы показать мощь(или слабость)switch
Sh0cK
0 / 0 / 0
Регистрация: 28.10.2012
Сообщений: 58
11.01.2013, 02:23  [ТС]     Неизвестная функция #23
C++
1
2
3
4
5
6
7
8
9
class Token {
public:
        char kind;
        double value;
        Token(char ch)
                :kind(ch), value(0) {}
        Token(char ch, double val)
                :kind(ch), value(val) {}
};
Или вот допустим класс. Мы когда его используем куда девается значение 0 переменной value?
Почему нельзя реализовать вот так:
C++
1
2
3
4
5
6
7
8
9
class Token {
public:
        char kind;
        double value;
        Token(char ch)
                :kind(ch){}
        Token(double val)
                :value(val) {}
};
Отдельно знаки, отдельно литералы с плавающей точкой.

Добавлено через 2 минуты
Цитата Сообщение от Avazart Посмотреть сообщение
А если sin() или pi (=3.14) ?
Таких функций пока там нету)
Avazart
 Аватар для Avazart
6893 / 5133 / 250
Регистрация: 10.12.2010
Сообщений: 22,560
Записей в блоге: 17
11.01.2013, 02:25     Неизвестная функция #24
Цитата Сообщение от Sh0cK Посмотреть сообщение
Таких функций пока там нету)
Ну там да вроде нету, а в моем примере есть еще таблица ...

Добавлено через 1 минуту
Цитата Сообщение от Sh0cK Посмотреть сообщение
Мы когда его используем куда девается значение 0 переменной value?
Ну так там инициализация в конструкторе, не пойму вопроса...
Sh0cK
0 / 0 / 0
Регистрация: 28.10.2012
Сообщений: 58
11.01.2013, 02:27  [ТС]     Неизвестная функция #25
Чесно, в том коде который ты приводил много строчек для меня не понятных)
ValeryS
Модератор
6373 / 4839 / 440
Регистрация: 14.02.2011
Сообщений: 16,038
11.01.2013, 02:29     Неизвестная функция #26
Цитата Сообщение от Sh0cK Посмотреть сообщение
куда девается значение 0 переменной value?
ты имеешь ввиду это
Цитата Сообщение от Sh0cK Посмотреть сообщение
value(0)
это инициализация переменной в данном случае 0

Цитата Сообщение от Sh0cK Посмотреть сообщение
Token(char ch, double val)
* * * * * * * * :kind(ch), value(val) {}
инициализация значением переданным в конструктор
можно написать так


C++
1
2
3
4
5
6
7
8
9
10
Token(char ch)
{
kind=ch;
value=0;
}
Token(char ch, double val)
{
kind=ch;
value=val;
}
в твоей же версии в зависимости от конструктора в одной из членов класса будет мусор
Sh0cK
0 / 0 / 0
Регистрация: 28.10.2012
Сообщений: 58
11.01.2013, 02:32  [ТС]     Неизвестная функция #27
Т.е. когда я ввожу выражение этот 0 не записывается в вектор?
Avazart
 Аватар для Avazart
6893 / 5133 / 250
Регистрация: 10.12.2010
Сообщений: 22,560
Записей в блоге: 17
11.01.2013, 02:38     Неизвестная функция #28
0 записывается если он в конструктор передается, а если нет то мусор...

Добавлено через 3 минуты
К примеру в этом месте

C++
1
2
    case '(': case ')': case '+': case '-': case '*': case '/': 
        return Token(ch);        // let each character represent itself
Sh0cK
0 / 0 / 0
Регистрация: 28.10.2012
Сообщений: 58
11.01.2013, 02:40  [ТС]     Неизвестная функция #29
Давайте по порядку:
допустим ввел я выражение 1+2, что в это время делает программа:
создает объект типа Token и считывает в него выражение вот у меня возникает собственно первый вопрос выражение которое считывается из потока ввода как оно собственно "живет" там в объекте t? Оно считывается по одному символу т.е. оно увидело 1 считало потом в класс "смотрит":"ага значит числа у нас передаются в этот конструктор" и туда его записывает?
Avazart
 Аватар для Avazart
6893 / 5133 / 250
Регистрация: 10.12.2010
Сообщений: 22,560
Записей в блоге: 17
11.01.2013, 02:41     Неизвестная функция #30
Ссылка по теме калькулятора Пишем свой интерпретатор языка BASIC
Sh0cK
0 / 0 / 0
Регистрация: 28.10.2012
Сообщений: 58
11.01.2013, 02:59  [ТС]     Неизвестная функция #31
Цитата Сообщение от #pragma Посмотреть сообщение
Нехватает смены значения curr_tok,что и приводит к ошибочной работе.
может это пример из другой книги я же писал что многое не понимаю тот код и код Страуструпа расходятся на все 100%
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
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
/*
    calculator08buggy.cpp
 
    Helpful comments removed.
 
    We have inserted 3 bugs that the compiler will catch and 3 that it won't.
*/
 
#include "std_lib_facilities.h"
 
struct Token {
    char kind;
    double value;
    string name;
    Token(char ch) :kind(ch), value(0) { }
    Token(char ch, double val) :kind(ch), value(val) { }
};
 
class Token_stream {
    bool full;
    Token buffer;
public:
    Token_stream() :full(0), buffer(0) { }
 
    Token get();
    void unget(Token t) { buffer=t; full=true; }
 
    void ignore(char);
};
 
const char let = 'L';
const char quit = 'Q';
const char print = ';';
const char number = '8';
const char name = 'a';
 
Token Token_stream::get()
{
    if (full) { full=false; return buffer; }
    char ch;
    cin >> ch;
    switch (ch) {
    case '(':
    case ')':
    case '+':
    case '-':
    case '*':
    case '/':
    case '%':
    case ';':
    case '=':
        return Token(ch);
    case '.':
    case '0':
    case '1':
    case '2':
    case '3':
    case '4':
    case '5':
    case '6':
    case '7':
    case '8':
    case '9':
    {   cin.unget();
        double val;
        cin >> val;
        return Token(number,val);
    }
    default:
        if (isalpha(ch)) {
            string s;
            s += ch;
            while(cin.get(ch) && (isalpha(ch) || isdigit(ch))) s=ch;
            cin.unget();
            if (s == "let") return Token(let);  
            if (s == "quit") return Token(name);
            return Token(name,s);
        }
        error("Bad token");
    }
}
 
void Token_stream::ignore(char c)
{
    if (full && c==buffer.kind) {
        full = false;
        return;
    }
    full = false;
 
    char ch;
    while (cin>>ch)
        if (ch==c) return;
}
 
struct Variable {
    string name;
    double value;
    Variable(string n, double v) :name(n), value(v) { }
};
 
vector<Variable> names; 
 
double get_value(string s)
{
    for (int i = 0; i<names.size(); ++i)
        if (names[i].name == s) return names[i].value;
    error("get: undefined name ",s);
}
 
void set_value(string s, double d)
{
    for (int i = 0; i<=names.size(); ++i)
        if (names[i].name == s) {
            names[i].value = d;
            return;
        }
    error("set: undefined name ",s);
}
 
bool is_declared(string s)
{
    for (int i = 0; i<names.size(); ++i)
        if (names[i].name == s) return true;
    return false;
}
 
Token_stream ts;
 
double expression();
 
double primary()
{
    Token t = ts.get();
    switch (t.kind) {
    case '(':
    {   double d = expression();
        t = ts.get();
        if (t.kind != ')') error("'(' expected");
    }
    case '-':
        return - primary();
    case number:
        return t.value;
    case name:
        return get_value(t.name);
    default:
        error("primary expected");
    }
}
 
double term()
{
    double left = primary();
    while(true) {
        Token t = ts.get();
        switch(t.kind) {
        case '*':
            left *= primary();
            break;
        case '/':
        {   double d = primary();
            if (d == 0) error("divide by zero");
            left /= d;
            break;
        }
        default:
            ts.unget(t);
            return left;
        }
    }
}
 
double expression()
{
    double left = term();
    while(true) {
        Token t = ts.get();
        switch(t.kind) {
        case '+':
            left += term();
            break;
        case '-':
            left -= term();
            break;
        default:
            ts.unget(t);
            return left;
        }
    }
}
 
double declaration()
{
    Token t = ts.get();
    if (t.kind != 'a') error ("name expected in declaration");
    string name = t.name;
    if (is_declared(name)) error(name, " declared twice");
    Token t2 = ts.get();
    if (t2.kind != '=') error("= missing in declaration of " ,name);
    double d = expression();
    names.push_back(Variable(name,d));
    return d;
}
 
double statement()
{
    Token t = ts.get();
    switch(t.kind) {
    case let:
        return declaration();
    default:
        ts.unget(t);
        return expression();
    }
}
 
void clean_up_mess()
{
    ts.ignore(print);
}
 
const string prompt = "> ";
const string result = "= ";
 
void calculate()
{
    while(true) try {
        cout << prompt;
        Token t = ts.get();
        while (t.kind == print) t=ts.get();
        if (t.kind == quit) return;
        ts.unget(t);
        cout << result << statement() << endl;
    }
    catch(runtime_error& e) {
        cerr << e.what() << endl;
        clean_up_mess();
    }
}
 
int main()
 
    try {
        calculate();
        return 0;
    }
    catch (exception& e) {
        cerr << "exception: " << e.what() << endl;
        char c;
        while (cin >>c&& c!=';') ;
        return 1;
    }
    catch (...) {
        cerr << "exception\n";
        char c;
        while (cin>>c && c!=';');
        return 2;
    }
Добавлено через 10 минут
В общем не буду вас напрягать лучше опять буду перечитывать главу, а потом опять, и опять пока не пойму)
Avazart
 Аватар для Avazart
6893 / 5133 / 250
Регистрация: 10.12.2010
Сообщений: 22,560
Записей в блоге: 17
11.01.2013, 03:04     Неизвестная функция #32
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
Token get()
{
    if (full) {       // do we already have a Token ready?
        // remove token from buffer
        full=false;
        return buffer;
    } 
 
    char ch;
    cin >> ch;    // note that >> skips whitespace (space, newline, tab, etc.)
 
    switch (ch) {
    case ';':    // for "print"
    case 'q':    // for "quit"
    case '(': case ')': case '+': case '-': case '*': case '/': 
        return Token(ch);        // let each character represent itself
    case '.':
    case '0': case '1': case '2': case '3': case '4':
    case '5': case '6': case '7': case '9':
        {    
            cin.putback(ch);         // put digit back into the input stream
            double val;
            cin >> val;              // read a floating-point number
            return Token('8',val);   // let '8' represent "a number"
        }
    default:
        error("Bad token");
    }
}
Читает символ ch если ch не число ( знак,скобка итп) создает, то возвращает объект Token(ch); (kind= ch , value= 0 )
если нет, то возвращает символ в поток и читает double целиком и возвращает Token('8',val); (kind= '8' , value= val; )

Что тут непонятно ?
Sh0cK
0 / 0 / 0
Регистрация: 28.10.2012
Сообщений: 58
11.01.2013, 03:11  [ТС]     Неизвестная функция #33
Спасибо за разъяснения) Но меня не это волнует, а механизм переписи символов, литералов потока ввода в структуру? А конкретнее как он происходит?
Вот у меня возникает собственно первый вопрос выражение которое считывается из потока ввода как оно собственно "живет" там в объекте t? Оно считывается по одному символу т.е. оно увидело 1 считало потом в класс "смотрит":"ага значит числа у нас передаются в этот конструктор" и туда его записывает?
Avazart
 Аватар для Avazart
6893 / 5133 / 250
Регистрация: 10.12.2010
Сообщений: 22,560
Записей в блоге: 17
11.01.2013, 03:15     Неизвестная функция #34
Не пойму о чем Вы?
Token get()- это метод Token_stream через него то и попадают символы/значения :
C++
1
Token t = ts.get();
C++
1
ts.putback(t);
Sh0cK
0 / 0 / 0
Регистрация: 28.10.2012
Сообщений: 58
11.01.2013, 03:18  [ТС]     Неизвестная функция #35
Цитата Сообщение от Avazart Посмотреть сообщение
Token_stream
Я не об этом варианте кода, а о том который в шапке
Avazart
 Аватар для Avazart
6893 / 5133 / 250
Регистрация: 10.12.2010
Сообщений: 22,560
Записей в блоге: 17
11.01.2013, 03:19     Неизвестная функция #36
Я о том коде который вы в архиве выложили, но там вроде как чет не хватает вроде ...
Sh0cK
0 / 0 / 0
Регистрация: 28.10.2012
Сообщений: 58
11.01.2013, 03:25  [ТС]     Неизвестная функция #37

Сейчас просмотрю тот листинг

Добавлено через 4 минуты
Тот архив это Листинг Страуструпа но он не компилируется даже
Avazart
 Аватар для Avazart
6893 / 5133 / 250
Регистрация: 10.12.2010
Сообщений: 22,560
Записей в блоге: 17
11.01.2013, 03:28     Неизвестная функция #38
Ну там только cpp файл (calculator02buggy.cpp) подозреваю что должен быть и std_lib_facilities.h
Sh0cK
0 / 0 / 0
Регистрация: 28.10.2012
Сообщений: 58
11.01.2013, 03:28  [ТС]     Неизвестная функция #39
У меня библиотека есть просто в нем куча ошибок
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.01.2013, 03:29     Неизвестная функция
Еще ссылки по теме:

Неизвестная ошибка C++
C++ Неизвестная ошибка
Неизвестная мне ошибка C++

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

Или воспользуйтесь поиском по форуму:
Avazart
 Аватар для Avazart
6893 / 5133 / 250
Регистрация: 10.12.2010
Сообщений: 22,560
Записей в блоге: 17
11.01.2013, 03:29     Неизвестная функция #40
Какая еще библиотека ?
Yandex
Объявления
11.01.2013, 03:29     Неизвестная функция
Ответ Создать тему
Опции темы

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