Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.78/9: Рейтинг темы: голосов - 9, средняя оценка - 4.78
0 / 0 / 0
Регистрация: 27.05.2015
Сообщений: 2
1

Упражнение для программы калькулятор из книги Язык программирования С++

27.05.2015, 17:28. Просмотров 1724. Ответов 4
Метки нет (Все метки)

Здравствуйте. Вот упражнение и калькулятор из книги Страуструпа. Не могли бы вы объяснить мне, как ввести в калькулятор функцию sin() ? Скиньте код если можно. Заранее спасибо.

(*2) Введите в программу калькулятора из $$3.1 такие функции, как sqrt(), log() и sin(). Подсказка:
задайте предопределенные имена и вызывайте функции с помощью массива указателей на них. Не
забывайте проверять параметры, передаваемые этим функциям.


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
#include <iostream>
#include <string>
#include <map>
#include <cctype>
#include <sstream>
#include <conio.h>
 
using namespace std;
 
istream* input;
int no_of_errors;
map<string,double> table;
 
double      number_value;
string      string_value;
 
int no_of_strings=0;
 
enum Token_value
{
NAME,NUMBER,END,PLUS='+',MINUS='-',MUL='*',DIV='/',
PRINT=',',ASSIGN='=',LP='(',RP=')'
};
 
Token_value curr_tok=PRINT;
 
double term(bool get);
double prim(bool get);
double expr(bool get);
int error(const string &s);
Token_value get_token();
 
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 term(bool get)
{
    double left=prim(get);
    for(;;)
    {
        switch(curr_tok)
        {
            case MUL    :   left*=prim(true);break;
            case DIV    :   if(double d=prim(true))
            {
                left/=d;
                break;
            };
                return error("DIVIZION BY ZERO");
            default     :   return left;
        };
    };
};
 
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=table[string_value];
            if(get_token()==ASSIGN)v=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 EXPRESSION EXPECTED");
    };
};
 
Token_value get_token()
{
    char ch=0;
    do{if(!input->get(ch))return curr_tok=END;}
    while(ch!='\n'&&isspace(ch));
    switch(ch)
    {
        case 0      :   return curr_tok=END;
 
        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 '.'    :
            input->putback(ch);
            *input>>number_value;
            return curr_tok=NUMBER;
        case ';'    :
        case '\n'   :
            no_of_strings++;
            return curr_tok=PRINT;
 
        default     :
            if (isalpha(ch))
            {
                string_value=ch;
                while(input->get(ch)&&isalpha(ch))
                        string_value.push_back(ch);
                input->putback(ch);
                return curr_tok=NAME;
            };
            error("INCORECT WORD");
            return curr_tok=PRINT;
    };
};
 
int error(const string &s)
{
    no_of_errors++;
    cerr<<no_of_strings<<" :-: ERROR:"<<s<<'\n';
    return 1;
};
 
int main(int argc, char* argv[])
{
    switch(argc)
    {
        case 1:
            input=&cin;
            break;
        case 2:
            input=new istringstream(argv[1]);
            break;
        default:
            error("To mach parameters!!!");
            return 1;
    };
    table ["pi"]=3.1415926535897932385;
    table["e"]  =2.7128272824590452354;
 
    while(input)
    {
        get_token();
        if(curr_tok==END)break;
        if(curr_tok==PRINT)continue;
        cout<<expr(false)<<'\n';
    };
    if(input!=&cin)delete input;
 
    return no_of_errors;
};
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
27.05.2015, 17:28
Ответы с готовыми решениями:

Калькулятор из книги Язык программирования С++ (автор Бьерн Страуструп)
Доброго времени суток. Изучаю С++, начал с классической книги Страуструпа: Язык программирования...

Упражнение из книги Страуструпа. Программа мини-калькулятор. Цифры записанные в строковом формате
Привет всем. Не могу понять, как необходимо изменить программу исходя из условия упражнения....

Как называется движение программирования или теория программы считывающая др. язык программирования
Не знал, как по другому задать вопрос, и также назвать тему, но буду краток: Допустим я хочу...

Пример с книги Стивена Прата (Язык программирования с++). Расхождение в ответе
В книге один ответ. У меня другой выходит (На русский перевод, не обращайте внимание) Сама...

4
9 / 9 / 8
Регистрация: 24.10.2013
Сообщений: 216
27.05.2015, 17:34 2
Если я правильно понял, то вам нужна функция sin(). Она есть уже готовая, в библиотеках.
Попробуйте подключить либо
C++ (Qt)
1
#include <math.h>
, либо
C++ (Qt)
1
#include <math>
, должно работать.
Получить ссылку на функцию:
C++ (Qt)
1
&sin
0
0 / 0 / 0
Регистрация: 27.05.2015
Сообщений: 2
27.05.2015, 17:44  [ТС] 3
Что библиотеку подключить это понятно. Я не пойму как задать sin() в функцию ввода в калькуляторе т.е. куда вписать ее.
0
9 / 9 / 8
Регистрация: 24.10.2013
Сообщений: 216
27.05.2015, 21:15 4
У вас консольный ввод, верно? Я не понимаю проблемы
0
3168 / 1927 / 312
Регистрация: 27.08.2010
Сообщений: 5,131
Записей в блоге: 1
27.05.2015, 23:04 5
Цитата Сообщение от Ryder95 Посмотреть сообщение
не понимаю проблемы
Лексему нужно добавить. И ее обработку. + Обработку возможной ошибки - оставлено в качестве упражнения для читателя.
1
Миниатюры
Упражнение для программы калькулятор из книги Язык программирования С++  
Вложения
Тип файла: 7z calc.cpp.7z (1.3 Кб, 18 просмотров)
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
27.05.2015, 23:04

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Как называется язык программирования для программирования на Android?
Как называется язык программирования для программирования на Android?

Что мощнее язык программирования Perl или язык программирования PHP
Какой из них лучше

Нужны объяснения примеров из книги "Язык программирования Си" Брайан Керниган, Деннис Ритчи
Добры день. Начал читать книгу &quot;Язык программирования Си&quot; Брайан Керниган, Деннис Ритчи; для...

Перевод программы из языка программирования Perl в язык Python
Здраствуйте, имею код написанный на perl, нужно его перевести в python, может кто-то помочь? Буду...


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

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

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