Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.83/40: Рейтинг темы: голосов - 40, средняя оценка - 4.83
0 / 0 / 1
Регистрация: 28.10.2012
Сообщений: 58

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

10.01.2013, 23:02. Показов 8760. Ответов 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
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
10.01.2013, 23:02
Ответы с готовыми решениями:

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

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

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

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

Не по теме:

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

0
0 / 0 / 1
Регистрация: 28.10.2012
Сообщений: 58
10.01.2013, 23:53  [ТС]
Цитата Сообщение от v.a.l.i.d Посмотреть сообщение
Не по теме:
А вообще эта книга тяжелая. Лучше что полегче взять
А что посоветуете?
0
 Аватар для v.a.l.i.d
425 / 390 / 113
Регистрация: 21.09.2012
Сообщений: 913
10.01.2013, 23:55
Цитата Сообщение от Sh0cK Посмотреть сообщение
А что посоветуете?
1) Харви М. Дейтел, Пол Дж. Дейтел Как программировать на C++ (2008)
2) Прата С. Язык программирования С++ Лекции и упражнения 2011
0
0 / 0 / 1
Регистрация: 28.10.2012
Сообщений: 58
11.01.2013, 00:08  [ТС]
Цитата Сообщение от v.a.l.i.d Посмотреть сообщение
1) Харви М. Дейтел, Пол Дж. Дейтел Как программировать на C++ (2008)
2) Прата С. Язык программирования С++ Лекции и упражнения 2011
Да и Страуструпа книга не плохая просто пример он выбрал неудачный (калькулятор) я раз 10 перечитывал тему все-равно въехать не могу А Дейтелов я использую как пособие, ну что если в Страуструпе непонятно я к ним)
0
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
11.01.2013, 00:16
Цитата Сообщение от Sh0cK Посмотреть сообщение
я раз 10 перечитывал тему
Ну так я тоже долго в код пялилися ... там ведь рекурсия запутанная... но собственно не сказал бы что сложно...
0
0 / 0 / 1
Регистрация: 28.10.2012
Сообщений: 58
11.01.2013, 00:50  [ТС]
Цитата Сообщение от Avazart Посмотреть сообщение
но собственно не сказал бы что сложно...
Круто а мне с мозгами не повезло в ВУЗе я учусь нормально, даже хорошо, но С++ мне никак воопще не дается я и разных авторов пробовал и с разных сторон - никак! Склад мозгов не для этого((
0
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
11.01.2013, 00:52
Время нужно для осознания...

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

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

Добавлено через 37 секунд
Разбор классов.
0
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
11.01.2013, 01:00
Спрашивайте конкретно что непонятно...

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

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

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

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

Добавлено через 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
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
11.01.2013, 01:37
Ну этот код разбирал тут немного иначе ( скопировано с исходников программы, не помню что-то я от себя добавлял вроде)

Кликните здесь для просмотра всего текста
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
0 / 0 / 1
Регистрация: 28.10.2012
Сообщений: 58
11.01.2013, 01:49  [ТС]
"Теперь можно сначала считать выражение, а вычислить его позднее. Например,
для выражения 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
0 / 0 / 1
Регистрация: 28.10.2012
Сообщений: 58
11.01.2013, 01:52  [ТС]
Avazart. Вот его листинг. И это он приводит в пример многого в нем даже не поясняя до этого. Может автора сменить? Ты с какой книги начинал?
Вложения
Тип файла: zip Архив ZIP - WinRAR.zip (1.9 Кб, 22 просмотров)
0
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
11.01.2013, 01:53
Цитата Сообщение от Sh0cK Посмотреть сообщение
Из его книги скопировал:"Каждый раздел case всегда завершается ключевым словом break."
Ну либо return, и не обязательно после каждого...
1
0 / 0 / 1
Регистрация: 28.10.2012
Сообщений: 58
11.01.2013, 01:58  [ТС]
Avazart, спасибо, жаль он этого в книге не написал)
0
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
11.01.2013, 02:00
Цитата Сообщение от Sh0cK Посмотреть сообщение
Avazart, спасибо, жаль он этого в книге не написал)
Ну это в других книгах пишут...
0
0 / 0 / 1
Регистрация: 28.10.2012
Сообщений: 58
11.01.2013, 02:01  [ТС]
Цитата Сообщение от Avazart Посмотреть сообщение
Ну это в других книгах пишут...
Ну так зачем объяснять одно а в своих примерах писать совершенно иное я ж не другую книгу читаю, а его)
0
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
11.01.2013, 02:07
Да дело в том что это место потенциальной ошибки - забыть break после case

Добавлено через 3 минуты
Цитата Сообщение от Sh0cK Посмотреть сообщение
В общем в книге предлагают при разложении на лексемы хранить их в виде пары(вид,значение), но зачем? Неужели нельзя просто хранить числа без обозначения что они являются числами?
А как хранить знаки и слова ?
0
0 / 0 / 1
Регистрация: 28.10.2012
Сообщений: 58
11.01.2013, 02:11  [ТС]
Цитата Сообщение от Avazart Посмотреть сообщение
А как хранить знаки и слова ?
Слова хранить не нужно(это калькулятор), а знаки в переменной типа char, а потом согласно программе переписать в вектор типа Token
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
11.01.2013, 02:11
Помогаю со студенческими работами здесь

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

Неизвестная ошибка с++
#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; ...

Неизвестная ошибка в VS
Здравствуйте. Я буквально вчера решил начать осваивать C++, потому у меня сразу возникли проблемы. Сразу прошу грязью меня не поливать. ...

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

Неизвестная ошибка
При написании кода столкнулся с такой ситуацией. При запуске программы происходит экстренное завершение программы. #include...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru