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

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

Войти
Регистрация
Восстановить пароль
 
Вадян
1 / 1 / 0
Регистрация: 25.05.2012
Сообщений: 42
#1

Дописать синус в анализатор Страуструпа - C++

25.12.2012, 21:10. Просмотров 301. Ответов 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
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
// LexicalAnalyzer.cpp
#include "LexicalAnalyzer.h"
 
 
std::map<std::string,double>table;
Token_value curr_tok=PRINT;
 
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("Деление на ноль");
            default:
                 return left;
        }
}
 
double number_value;
std::string string_value;
 
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("Ожидалась )");
            get_token();
            return e;
        }
        default:
            return error("Ожидалось первичное выражение");
    }
}
 
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 '=':
             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 ("Неправильная лексема");
             return curr_tok = PRINT;
    }
}
int no_of_errors=0;
int error (const std::string& s)
{
    no_of_errors++;
    std::cerr<<"Ошибка: "<<s<<'\n';
    return no_of_errors;
}
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// main.cpp
#include "LexicalAnalyzer.h"
 
 
int main()
{
    table["pi"]=3.1415926535897932385;
    table["e"]=2.7182818284590452354;
    while (std::cin) {
        get_token();
        if (curr_tok==END) break;
        if (curr_tok==PRINT) continue;
        std::cout<<expr(false)<<'\n';
    }
    return no_of_errors;
}
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
// LexicalAnalyzer.h
#ifndef LEXICALANALYZER_H_INCLUDED
#define LEXICALANALYZER_H_INCLUDED
 
#include <cctype>
#include <string>
#include <map>
#include <iostream>
 
enum Token_value {
    NAME,       NUMBER,      END,
    PLUS = '+', MINUS = '-', MUL = '*', DIV = '/',
    PRINT = ';',ASSIGN = '=',LP = '(',  RP = ')'
};
extern Token_value curr_tok;
extern std::map<std::string,double>table;
extern int no_of_errors;
 
Token_value get_token();
 
double expr(bool);
double term (bool);
double prim (bool);
int error(const std::string&);
 
#endif // LEXICALANALYZER_H_INCLUDED
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.12.2012, 21:10
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Дописать синус в анализатор Страуструпа (C++):

Задание из Страуструпа - C++
Добрый день,дорогие форумчане.В общем читаю книжечку Страуструпа.Выполняю задания.Вот что-то у меня ступор.Прошу Вашего совета:) ...

Калькулятор Страуструпа С++ - C++
Я новичок в С++, пытаюсь читать Страуструпа. Дошёл до строчного калькулятора и не понимаю принципов его работы, перечитывал главу 4 раза....

Угадайка от Страуструпа - C++
Писал, писал, устал. В логике ошибок нет. Как алгоритм оптимизировать и спагетти свернуть? #include &quot;std_lib_facilities.h&quot; int...

Калькулятор Страуструпа (C++) - C++
Добрый вечер! Я изучаю &quot;Принципы и практика использования C++&quot; Страуструпа. Все, что он пишет, хорошо понимаю, но следующая логика...

задачки Страуструпа - C++
Сижу в обнимку с талмудом Страуструпа, изучаю С++ самостоятельно. Просить код писать не буду, разберусь. Некоторые терминологические вещи...

Калькулятор страуструпа - C++
Ну по крайней мере если это и не он, то очень на него похож. Проблема в скобках.Например: (1+1 - всё хорошо, выплывет ощибка...

1
Вадян
1 / 1 / 0
Регистрация: 25.05.2012
Сообщений: 42
26.12.2012, 23:13  [ТС] #2
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.12.2012, 23:13
Привет! Вот еще темы с ответами:

Калькулятор в книге Страуструпа - C++
Я знал, что это довольно тяжелая книга, поэтому начал читать ее после другой о С++, но пример &quot;элементарного&quot; калькулятора поставил меня в...

Задача из книги Страуструпа - C++
Нужна ваша помощь или хотя бы подсказка, в одном из упражнений в книге Страуструпа &quot; Программирование. Принципы и практика с использованием...

Какая книга Страуструпа - C++
Как вы думаете, что лучше купить человеку который не когда не программировал из страуструпа: Бьярне Страуструп Программирование: принципы...

Калькулятор в книге Страуструпа - C++
Приветствую всех кто читает эту тему. У меня возникла проблема во время написании калькулятора. Он был описан в 6 главе книги и там же...


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

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

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