Форум программистов, компьютерный форум 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++ Неизвестная ошибка с++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
v.a.l.i.d
 Аватар для v.a.l.i.d
412 / 377 / 10
Регистрация: 21.09.2012
Сообщений: 913
10.01.2013, 23:48     Неизвестная функция #2
Token get_token();
Это обычная пользовательская функция, возвращает тип Token. То есть в C++ она не встроена. Ее сам программист сначала должен создать а уже после этого использовать. Вроде так )

Не по теме:

А вообще эта книга тяжелая. Лучше что полегче взять

Sh0cK
0 / 0 / 0
Регистрация: 28.10.2012
Сообщений: 58
10.01.2013, 23:53  [ТС]     Неизвестная функция #3
Цитата Сообщение от v.a.l.i.d Посмотреть сообщение
Не по теме:
А вообще эта книга тяжелая. Лучше что полегче взять
А что посоветуете?
v.a.l.i.d
 Аватар для v.a.l.i.d
412 / 377 / 10
Регистрация: 21.09.2012
Сообщений: 913
10.01.2013, 23:55     Неизвестная функция #4
Цитата Сообщение от Sh0cK Посмотреть сообщение
А что посоветуете?
1) Харви М. Дейтел, Пол Дж. Дейтел Как программировать на C++ (2008)
2) Прата С. Язык программирования С++ Лекции и упражнения 2011
Sh0cK
0 / 0 / 0
Регистрация: 28.10.2012
Сообщений: 58
11.01.2013, 00:08  [ТС]     Неизвестная функция #5
Цитата Сообщение от v.a.l.i.d Посмотреть сообщение
1) Харви М. Дейтел, Пол Дж. Дейтел Как программировать на C++ (2008)
2) Прата С. Язык программирования С++ Лекции и упражнения 2011
Да и Страуструпа книга не плохая просто пример он выбрал неудачный (калькулятор) я раз 10 перечитывал тему все-равно въехать не могу А Дейтелов я использую как пособие, ну что если в Страуструпе непонятно я к ним)
Avazart
 Аватар для Avazart
6897 / 5137 / 252
Регистрация: 10.12.2010
Сообщений: 22,570
Записей в блоге: 17
11.01.2013, 00:16     Неизвестная функция #6
Цитата Сообщение от Sh0cK Посмотреть сообщение
я раз 10 перечитывал тему
Ну так я тоже долго в код пялилися ... там ведь рекурсия запутанная... но собственно не сказал бы что сложно...
Sh0cK
0 / 0 / 0
Регистрация: 28.10.2012
Сообщений: 58
11.01.2013, 00:50  [ТС]     Неизвестная функция #7
Цитата Сообщение от Avazart Посмотреть сообщение
но собственно не сказал бы что сложно...
Круто а мне с мозгами не повезло в ВУЗе я учусь нормально, даже хорошо, но С++ мне никак воопще не дается я и разных авторов пробовал и с разных сторон - никак! Склад мозгов не для этого((
Avazart
 Аватар для Avazart
6897 / 5137 / 252
Регистрация: 10.12.2010
Сообщений: 22,570
Записей в блоге: 17
11.01.2013, 00:52     Неизвестная функция #8
Время нужно для осознания...

Этот пример не для тех кто буквально начинает, а для тех кто уже прошел какой то обзорный курс основ языка и переходит к практической стороне...
Sh0cK
0 / 0 / 0
Регистрация: 28.10.2012
Сообщений: 58
11.01.2013, 01:00  [ТС]     Неизвестная функция #9
Буду читать и ждать пока осознание придет)) Ну в любом случае бросать не собираюсь))

Добавлено через 4 минуты
Цитата Сообщение от Avazart Посмотреть сообщение
переходит к практической стороне...
Ну так я и прошел этот курс по книге 5 первых глав, это шестая

Добавлено через 37 секунд
Разбор классов.
Avazart
 Аватар для Avazart
6897 / 5137 / 252
Регистрация: 10.12.2010
Сообщений: 22,570
Записей в блоге: 17
11.01.2013, 01:00     Неизвестная функция #10
Спрашивайте конкретно что непонятно...

Цитата Сообщение от Sh0cK Посмотреть сообщение
Разбор классов.
Предыдущий калькулятор кажется был на базе ф-ций, его осилили ?
Sh0cK
0 / 0 / 0
Регистрация: 28.10.2012
Сообщений: 58
11.01.2013, 01:29  [ТС]     Неизвестная функция #11
Нет, до этого калькуляторов небыло)

Добавлено через 59 секунд
Если что то книга эта: "PROGRAMMING Principles and Practice Using C++ "

Добавлено через 4 минуты
Хотя... была одна попытка (в книге) но там калькулятор на выражение в котором одно действие с ним разобратся было очень про100) А как он начал писать об разложениии на лексемы с помощью классов тут-то и понеслось)

Добавлено через 13 минут
Цитата Сообщение от Avazart Посмотреть сообщение
Спрашивайте конкретно что непонятно...
В общем в книге предлагают при разложении на лексемы хранить их в виде пары(вид,значение), но зачем? Неужели нельзя просто хранить числа без обозначения что они являются числами?

Добавлено через 7 минут
Хотя он сам (Страуструп не использует это) вот в этой строчке, очевидно, он просто считывает строку выражения, и пользователь в програме не вводит выражение примером так '8'2+'8'3??
Страуструп:"Обратите внимание на то, что для простых лексем значение не требуется, поэто-
му мы не используем член value. Нам нужен символ для обозначения чисел.
Мы выбрали символ '8' просто потому, что он явно не оператор и не знак пунктуа-
ции. Использование символа '8' для обозначения чисел немного загадочно, но это
лишь на первых порах."
Код:
C#
1
2
3
4
5
6
7
8
9
Token get_token();
vector<Token> tok;
 
int main()
{
while(cin){
    Token t = get_token();
    tok.push_back(t);
}
Avazart
 Аватар для Avazart
6897 / 5137 / 252
Регистрация: 10.12.2010
Сообщений: 22,570
Записей в блоге: 17
11.01.2013, 01:37     Неизвестная функция #12
Ну этот код разбирал тут немного иначе ( скопировано с исходников программы, не помню что-то я от себя добавлял вроде)

Кликните здесь для просмотра всего текста
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
//stl
#include <iostream>
#include <iomanip>
#include <algorithm>
#include <iterator>
#include <Math.hpp>
#include <string>
#include <map>
using namespace std;
//---------------------------------------------------------------------------
#pragma argsused
enum Token_value {
        NAME, NUMBER, END,
        PLUS = '+', MINUS='-', MUL='*', DIV='/',
        PRINT=';', ASSIGN='=', LP='(', RP=')',POW='^'
};
Token_value curr_tok=PRINT;
 
std::map<std::string,double> table;
double number_value;
std::string string_value;
int no_of_errors;
//-------------------------------------------
double error(const std::string& s){
        no_of_errors++;
        std::cerr << "error: " << s << std::endl;
        return 1;
}
//-------------------------------------------
Token_value get_token()
{
    char ch = 0;
    do {
        if (!std::cin.get(ch)) return curr_tok = END;
    } while (ch!='\n'&&isspace(ch));
 
    switch (ch) {
        case 0:
             return curr_tok = END;
        case ';':case '\n':
             return curr_tok = PRINT;
        case '^':case '*':case'/':case '+':case '-':case '(':case ')':case '=':
             return curr_tok=Token_value(ch);
        case '0':case '1':case '2':case '3':case '4' :
        case '5':case '6':case '7':case '8':case '9':case '.':
             std::cin.putback(ch);
             std::cin>>number_value;
             return curr_tok=NUMBER;
        default:
             if (isalpha(ch)) {
                 string_value = ch;
                 while (std::cin.get(ch)&&isalnum(ch)) string_value.push_back(ch);
                 std::cin.putback(ch);
                 return curr_tok = NAME;
             }
             error ("bad token");
             return curr_tok = PRINT;
    }
}
//-------------------------------------------
double expr(bool get);
double power(bool get);
//-------------------------------------------
double prim(bool get){
        if (get) get_token();
        switch (curr_tok){
        case NUMBER:{
                double v=number_value;
                get_token();
                return v;
        }
        case NAME:{
                double v;
                //double& v = table[string_value];
                //if (get_token()==ASSIGN) v=expr(true);
                if (string_value=="sin") { v= sin(DegToRad(expr(true))); }
 
                return v;
        }
        case MINUS:return -prim(true);
        case LP:{
                double e=expr(true);
                if (curr_tok!=RP) return error("')'expected");
                get_token();
                return e;
        }
        default:
                return error("primary expected");
        }
}
//-------------------------------------------
double term(bool get){
        double left=power(get);
        for (;;)
                switch (curr_tok){
                 case MUL:
                         left*=power(true);
                         break;
                 case DIV:
                         if (double d=power(true)){
                                 left /= d;
                                 break;
                         }
                         return error("divide by 0");
 
                 default:return left;
                }
}
//-------------------------------------------
double expr(bool get){
        double left=term(get);
        for (;;)
                switch(curr_tok){
                case PLUS:
                        left+=term(true);
                        break;
                case MINUS:
                        left-=term(true);
                        break;
                default:
                        return left;
                }
}
//-------------------------------------------
double power(bool get){
        double left=prim(get);
        for (;;)
                switch(curr_tok){
                case POW:
                        left=pow(left,prim(true));
                        break;
                default:
                        return left;
                }
}
//------------------------------------------------------------------------
int _tmain(int argc, _TCHAR* argv[])
{
table["pi"]=3.141592653589793;
table["e"]=2.7182818284590452;
while (std::cin)
 {
 get_token();
 if (curr_tok==END) break;
 if (curr_tok==PRINT) continue;
 std::cout << expr(false) << std::endl;
 }
return no_of_errors;
}
//---------------------------------------------------------------------------
Sh0cK
0 / 0 / 0
Регистрация: 28.10.2012
Сообщений: 58
11.01.2013, 01:49  [ТС]     Неизвестная функция #13
"Теперь можно сначала считать выражение, а вычислить его позднее. Например,
для выражения 11*12 получим следующие лексемы:
'8' * '8'
11 12
Мне интересно откуда появятся "'8'" в ввод я их не вбиваю, может это просто условность?

Добавлено через 2 минуты
Цитата Сообщение от Avazart Посмотреть сообщение
C++
1
enum Token_value
Перечислений в книге еще небыло...

Добавлено через 6 минут
Да и еще он постоянно вводит какието новые конструкции в листин даже их не пояснив) Например функия get_token, а вот этот код меня воопще ошарашил
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");
    }
}
до сих пор я думал что каждый блок case должен заканчиватся оператором break, а как оказывается нет одним махом снес всю логику того о чем он раньше писал) Из его книги скопировал:"Каждый раздел case всегда завершается ключевым словом break."
Sh0cK
0 / 0 / 0
Регистрация: 28.10.2012
Сообщений: 58
11.01.2013, 01:52  [ТС]     Неизвестная функция #14
Avazart. Вот его листинг. И это он приводит в пример многого в нем даже не поясняя до этого. Может автора сменить? Ты с какой книги начинал?
Вложения
Тип файла: zip Архив ZIP - WinRAR.zip (1.9 Кб, 4 просмотров)
Avazart
 Аватар для Avazart
6897 / 5137 / 252
Регистрация: 10.12.2010
Сообщений: 22,570
Записей в блоге: 17
11.01.2013, 01:53     Неизвестная функция #15
Цитата Сообщение от Sh0cK Посмотреть сообщение
Из его книги скопировал:"Каждый раздел case всегда завершается ключевым словом break."
Ну либо return, и не обязательно после каждого...
Sh0cK
0 / 0 / 0
Регистрация: 28.10.2012
Сообщений: 58
11.01.2013, 01:58  [ТС]     Неизвестная функция #16
Avazart, спасибо, жаль он этого в книге не написал)
Avazart
 Аватар для Avazart
6897 / 5137 / 252
Регистрация: 10.12.2010
Сообщений: 22,570
Записей в блоге: 17
11.01.2013, 02:00     Неизвестная функция #17
Цитата Сообщение от Sh0cK Посмотреть сообщение
Avazart, спасибо, жаль он этого в книге не написал)
Ну это в других книгах пишут...
Sh0cK
0 / 0 / 0
Регистрация: 28.10.2012
Сообщений: 58
11.01.2013, 02:01  [ТС]     Неизвестная функция #18
Цитата Сообщение от Avazart Посмотреть сообщение
Ну это в других книгах пишут...
Ну так зачем объяснять одно а в своих примерах писать совершенно иное я ж не другую книгу читаю, а его)
Avazart
 Аватар для Avazart
6897 / 5137 / 252
Регистрация: 10.12.2010
Сообщений: 22,570
Записей в блоге: 17
11.01.2013, 02:07     Неизвестная функция #19
Да дело в том что это место потенциальной ошибки - забыть break после case

Добавлено через 3 минуты
Цитата Сообщение от Sh0cK Посмотреть сообщение
В общем в книге предлагают при разложении на лексемы хранить их в виде пары(вид,значение), но зачем? Неужели нельзя просто хранить числа без обозначения что они являются числами?
А как хранить знаки и слова ?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.01.2013, 02:11     Неизвестная функция
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
Sh0cK
0 / 0 / 0
Регистрация: 28.10.2012
Сообщений: 58
11.01.2013, 02:11  [ТС]     Неизвестная функция #20
Цитата Сообщение от Avazart Посмотреть сообщение
А как хранить знаки и слова ?
Слова хранить не нужно(это калькулятор), а знаки в переменной типа char, а потом согласно программе переписать в вектор типа Token
Yandex
Объявления
11.01.2013, 02:11     Неизвестная функция
Ответ Создать тему
Опции темы

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