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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 16, средняя оценка - 4.69
Sh0cK
0 / 0 / 0
Регистрация: 28.10.2012
Сообщений: 58
Завершенные тесты: 1
#1

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

10.01.2013, 23:02. Просмотров 3046. Ответов 58
Метки нет (Все метки)

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() она мне до этих пор не встречалась и я не понимаю в чем она заключается и зачем перед этой функцией название класса?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.01.2013, 23:02
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Неизвестная функция (C++):

неизвестная функция - C++
Здравствуйте ! Хочу откомпилировать код одной программы написанной на С на компиляторе borland билдер с++ 6 версии,но появлются следующие...

Неизвестная функция. Книга. Страуструп - C++
Я видел похожу тему, но толком ответа не нашел. Сразу к делу. Есть функция get_token(). Она не из стандартной библиотеки, т.е. её нужно...

неизвестная ошибка - C++
Помогите с кодом который из книги по изучению С++: Вот неработающий код: #include &lt;iostream&gt; using namespace std; ...

Неизвестная конструкция - C++
Задача поставлена так: Написать программу, переводящую арабские числа в римские. Задача упрощается тем, что можна считать, что 40=XXXX,...

Неизвестная ошибка - C++
Доброго время суток, я тут с толкнулся с непонятной штукой, все правильно точно так же как и показано на видео но почему то у меня ошибки...

Неизвестная ошибка - C++
При написании кода столкнулся с такой ситуацией. При запуске программы происходит экстренное завершение программы. #include &lt;conio.h&gt; ...

58
v.a.l.i.d
416 / 381 / 10
Регистрация: 21.09.2012
Сообщений: 913
10.01.2013, 23:48 #2
Token get_token();
Это обычная пользовательская функция, возвращает тип Token. То есть в C++ она не встроена. Ее сам программист сначала должен создать а уже после этого использовать. Вроде так )

Не по теме:

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

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

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

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

Добавлено через 37 секунд
Разбор классов.
0
Avazart
Эксперт С++
7586 / 5571 / 330
Регистрация: 10.12.2010
Сообщений: 24,999
Записей в блоге: 17
11.01.2013, 01:00 #10
Спрашивайте конкретно что непонятно...

Цитата Сообщение от Sh0cK Посмотреть сообщение
Разбор классов.
Предыдущий калькулятор кажется был на базе ф-ций, его осилили ?
0
Sh0cK
0 / 0 / 0
Регистрация: 28.10.2012
Сообщений: 58
Завершенные тесты: 1
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);
}
0
Avazart
Эксперт С++
7586 / 5571 / 330
Регистрация: 10.12.2010
Сообщений: 24,999
Записей в блоге: 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;
}
//---------------------------------------------------------------------------
0
Sh0cK
0 / 0 / 0
Регистрация: 28.10.2012
Сообщений: 58
Завершенные тесты: 1
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."
0
Sh0cK
0 / 0 / 0
Регистрация: 28.10.2012
Сообщений: 58
Завершенные тесты: 1
11.01.2013, 01:52  [ТС] #14
Avazart. Вот его листинг. И это он приводит в пример многого в нем даже не поясняя до этого. Может автора сменить? Ты с какой книги начинал?
0
Вложения
Тип файла: zip Архив ZIP - WinRAR.zip (1.9 Кб, 9 просмотров)
Avazart
Эксперт С++
7586 / 5571 / 330
Регистрация: 10.12.2010
Сообщений: 24,999
Записей в блоге: 17
11.01.2013, 01:53 #15
Цитата Сообщение от Sh0cK Посмотреть сообщение
Из его книги скопировал:"Каждый раздел case всегда завершается ключевым словом break."
Ну либо return, и не обязательно после каждого...
1
11.01.2013, 01:53
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.01.2013, 01:53
Привет! Вот еще темы с ответами:

Неизвестная ошибка с++ - C++
#include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;iomanip&gt; #include &lt;fstream&gt; #include &lt;math.h&gt; using namespace std; ...

Неизвестная ошибка - C++
Ребята все работает все запускается, но ошибка не исчезает... Подскажите...

Неизвестная escape-последовательность - C++
Ger = Fre.erase(0, Fre.find_first_of(&quot;\t\t&quot;)) + &quot;&lt;\German&gt;&quot;; Прога компилируются, но Выскакивает предупреждение: Предупреждение 1 ...

Неизвестная мне ошибка - C++
В общем имеется код: //--------------------------------------------------------------------------- #include &lt;iostream.h&gt; #include...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

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