Форум программистов, компьютерный форум CyberForum.ru

Калькулятор выводит неверный результат - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Шаблоны без параметров, что это? http://www.cyberforum.ru/cpp-beginners/thread1087191.html
Наткнулся во включаемом файле iosfwd в Visual Studio 2013 на такое определение:template<> struct char_traits<char>Вроде как похоже на определение шаблона структуры, но почему параметры шаблона пустые (зачем тогда вообще тут нужен шаблон?) и почему после char_traits стоят скобочки с параметром шаблона? Тут же должно стоять новое имя структуры? Ничего не пойму.
C++ Передача std::vector между классами Класс Data служит для инициализации переменных. Класс А - для обработки данных. В классе А меняются данные в контейнере std::vector (размер конейнера может меняться, но скорее нет). Правильно ля я делаю? Естьт ли тут место умным указателям? Сlass Data: Data.h: #ifndef DATA_H_ #define DATA_H_ class Data { public: Data(); http://www.cyberforum.ru/cpp-beginners/thread1087173.html
C++ Использование рекурсивной функции при написании простой игры
Суть такова: У нас имеется доска 5*5 ,есть шахматная фигура коня,которая должна обойти всю доску Что в данном коде не так?? #include <Windows.h> #include <iostream> using namespace std; const int size=5; int a={0};
C++ Как работает istreambuf_iterator?
Всем привет! Уважаемые форумчане, расскажите пожалуйста принцип работы istreambuf_iterator и ostreambuf_iterator. Перелопатил кучу информации в книгах, там вроде написано, но вдуплить не могу... Хотелось бы простым языком и с примерами. Как работать с istream_iterator и ostream_iterator понятно.
C++ Решение линейного уравнения http://www.cyberforum.ru/cpp-beginners/thread1087149.html
Напишите функцию,которая решает линейное уравнение ax+b=0 и записывает результат в переменную передаваемую по ссылке. В случае нахождения одного корня функция возвращает 1,в случае бессконечного множества решений (a=0<b=0) -2 , в случае ввода неправильных данных (а=0)-3 Вот программу по нахождению корня линейного уравнения я написал, а вторую часть задания выполнить не получается, а именно:"В...
C++ Не получается сделать задачу Нужно определить возможность существования треугольника по сторонам. Я ввод чисел написал #include <stdio.h> main () { int a,b,c; printf ("введите длины сторон"); scanf ("%d%d%d",&a,&b,&c); , а вот как дальше запустить цикл проверки (a<(c+b)) подробнее

Показать сообщение отдельно
Sergey_Chizhov
1 / 1 / 0
Регистрация: 21.09.2013
Сообщений: 30

Калькулятор выводит неверный результат - C++

01.02.2014, 20:37. Просмотров 432. Ответов 7
Метки (Все метки)

Изучаю С++ по Страуструпу.
Дошел до следующей задачи(калькулятор) и "буксую", не пойму в чем дело, код с книгой сверял несколько раз.
Программа запускается, но выводит не верный результат, всегда начинающийся с "156", и то после того как введешь ещё несколько дополнительных чисел.

Будьте добры, помогите начинающему)
Буду рад любой помощи.
Библиотеку "std_lib_facilities.h" можно найти здесь: Тайна Страуструпа - std_lib_facilities.h !

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
#include "std_lib_facilities.h"
 
class Token{
public:
    char kind;
    double value;
    Token(char ch)    // make a Token from a char
        :kind(ch), value(0) { }    
    Token(char ch, double val)     // make a Token from a char and a double
        :kind(ch), value(val) { }
};
 
class Token_stream {
public:
    Token_stream();
    Token get();
    void putback(Token t);
private:
    bool full;
    Token buffer;
};
 
Token_stream::Token_stream()
:full(false),buffer(0)
{
}
 
void Token_stream::putback(Token t)
{
    if(full) error("putback() в полный буфере");
    buffer = t;
    full = true;
}
 
 
//-------------------------------------------------------------------------------------------
 
Token Token_stream::get()    // считывает символы и составляет лексемы использует поток cin
{
    if(full){//если в буфере есть лексема, то удаляем ее
        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 '/': 
    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 '8': 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");
    }
}
 
 
Token_stream ts;        // provides get() and putback() 
 
//-----------------------------------------------------------------------------------------------
 
 
double expression();//реализует операции + и - вызывает функции term() и get_token()
double term();//реализует операции *,/ вызывает функции primary() и get_token()
//double primary();//реализует числа и скобки, вызывает функции expression() и get_token()
 
 
double primary(){
    Token t=ts.get();
    switch(t.kind){
        case '(':
            {
                double d = expression();
                t=ts.get();
                if(t.kind!=')') error("')' expected");
                return d;
            }
        case '8':
            return t.value;
        default:
            error("ozhidaetsy pervichnoe virazhenie");
    }
}
 
int main()
try{
    cout<<"This is calculator! \nYou can used: +,-,*,/,% and (,)  \nFor print results press '=' \nFor exit press 'q'\n";
    double val=0;
    while(cin){
        Token t=ts.get();
        if(t.kind=='q') break;
        if(t.kind=='=')
            cout<<'= '<<expression()<<endl;
        else
            ts.putback(t);
        val=expression();
    }
    keep_window_open("~0");
}
catch(exception& e){
    cerr<<e.what()<<endl;
    keep_window_open("~1");
    return 1;
}
catch(...){
    cerr<<"exeption \n";
    keep_window_open("~2");
    return 2;
}
 
double expression(){
    double left=term();
    Token t=ts.get();
    while(true){
        switch(t.kind){
            case '+':
                left+=term();
                t=ts.get();
                break;
            case '-':
                left-=term();
                t=ts.get();
                break;
            default:
                ts.putback(t);
                return left;
        }
    }
}
 
double term(){
    double left=primary();
    Token t=ts.get();
    while(true){
        switch(t.kind){
            case '*':
                left*=primary();
                t=ts.get();
                break;
            case '/':
                {
                    double d=primary();
                    if(d==0) error("delenie na 0!");
                    left/=d;
                    t=ts.get();
                    break;
                }
            default:
                ts.putback(t);
                return left;
        }
    }
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru