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

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

Войти
Регистрация
Восстановить пароль
 
SameeR
3 / 3 / 0
Регистрация: 10.04.2010
Сообщений: 14
#1

Калькулятор - C++

11.04.2010, 01:14. Просмотров 746. Ответов 6
Метки нет (Все метки)

вводиться некоторое матиматическое выражение. программа должна сама считовывать скобки и +-*/
и выводить на экран не результат а как она решена.

дана задача)
сам калькулятор я написал читая струструпа. (калькулятор работает как просто калькулятор.) но не могу вывести результат так как хочет препод.
спрашивал у препода говорит используй string чтобы он читал мат. выражение и выводил.
пока в голову ничего не пришло) как его использовать.
написал на visualc++

подскажите что надо еще ввести в код чтобы он выводил и результат и способ как он его решил

Добавлено через 20 минут
поискал на сайте но тут даны только простые калькуляторы.

Добавлено через 10 минут
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
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <ctype.h>
#include <assert.h>
 
int tok;
double tokval;
 
int next() {
    for (;;) {
        int c = getchar();
        if (c == EOF || strchr("+-*/^()\n", c) != NULL) return tok = c;
        if (isspace(c)) continue;
        if (isdigit(c) || c == '.') {
            ungetc(c, stdin);
            scanf(" %lf", &tokval);
            return tok = 'n';
        }
        fprintf(stderr, "Bad character: %c\n", c); abort();
    }
}
 
void skip(int t) { assert(tok == t); next(); }
 
double expr();
 
 
double numpar() {
    if (tok == 'n') { double x = tokval; skip('n'); return x; }
    skip('('); double x = expr(); skip(')'); return x;
}
 
 
double factor() {
    double x = numpar();
    if (tok == '^') { skip('^'); x = pow(x, factor()); }
    return x;
}
 
 
double term() {
    double x = factor();
    for (;;) {
        if (tok == '*') { skip('*'); x *= factor(); }
        else if (tok == '/') { skip('/'); x /= factor(); }
        else return x;
    }
}
 
 
double expr() {
    double x = term();
    for (;;) {
        if (tok == '+') { skip('+'); x += term(); }
        else if (tok == '-') { skip('-'); x -= term(); }
        else return x;
    }
}
 
int main() {
    next();
    while (tok != EOF) {
        if (tok == '\n') { skip('\n'); continue; }
        printf("%.9g\n", expr());
    }
    return 0;
}
это исходник который я использовал в своей программе.
если поможете я просто добавлю его в исходник и покажу преподу)

Добавлено через 20 часов 53 минуты
или дайте какой нить совет как это можно сделать
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.04.2010, 01:14
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Калькулятор (C++):

Простой калькулятор и калькулятор с парсингом - C++
Ребят я совсем не давно только начал изучать сишку, решил написать простенький калькулятор который работает с 2 числами. Возник вопрос, как...

Калькулятор на С++ - C++
Сделал калькулятор, работает нормально, но программа считает только два числа за раз: &gt;&gt;Картинка&lt;&lt; , как сделать так чтоб пользователь...

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

Калькулятор - C++
Пишу калькулятор. Прошу помощи. Вот мой код #include &lt;iostream&gt; #include &lt;locale.h&gt; #include &lt;string.h&gt; #include &lt;cmath&gt; using...

Калькулятор - C++
Помогите пожалуйста сделать в этом калькуляторе скобки. #include &lt;iostream&gt; #include &lt;stdlib.h&gt; #include &lt;string.h&gt; #include...

Калькулятор - C++
Решил написать калькулятор, а вот и он: #include&lt;conio.h&gt; #include&lt;locale.h&gt; #include&lt;stdio.h&gt; #define END '0' #define ERROR 'a' ...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Aye Aye
367 / 281 / 36
Регистрация: 17.12.2009
Сообщений: 567
11.04.2010, 01:24 #2
в общем преподу надо чотобы программа выводила последовательность действий с учетом приоритетов или что? "то как она решена" - это не понятно. ну например:
выражение 3*(9-5)+1 должно быть переведено в + * 3 - 9 5 1, префиксная нотация. так? или надо перевесли в постфиксную нотацию? дерево при выполнении можно использовать?
0
SameeR
3 / 3 / 0
Регистрация: 10.04.2010
Сообщений: 14
11.04.2010, 04:15  [ТС] #3
именно так последовательность действии +учет приоритетов
например 784*(78+(75/5)-3*4
вывести должна
75 / 5>78+ результат1> 784* результат2> 3*4> результат 3 -результат4
дерево можно.

Добавлено через 42 минуты
если быть точнне то так
75/5>+>78>*>748>->3*4
0
Aye Aye
367 / 281 / 36
Регистрация: 17.12.2009
Сообщений: 567
11.04.2010, 22:22 #4
у меня тут старая прога завалялась я там подкоректировал кое что. и в итоге:
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
#include <iostream>
using namespace std;
struct node{
    node *l,*r;
    char val;
    node(node *ll,node *rr,char c):l(ll),r(rr),val(c){}
};
void print(node *t,int n)
{
    if (t)
    {
        print(t->r,n+1);
        for (int i=0;i<n;i++) cout << "  ";
        cout << t->val << '\n';
        print(t->l,n+1);
    }
}
void del(node *&t)
{
    if (t)
    {
        del(t->r);
        del(t->l);
        delete t;
    }
 
}
char lookahead;
int amount_of_errors=0;
void match(char c)
{
    if (lookahead==c)
    {
        cin.get(lookahead);
        while(lookahead==' '||lookahead=='\t')cin.get(lookahead);
    }
    else
    {
        cout << "\nsyntax error in " << lookahead << '\n';
        amount_of_errors++;
    }
}
node *scan()
{
    while(lookahead==' '||lookahead=='\t')cin.get(lookahead);
    if (isalpha(lookahead)||isdigit(lookahead))return new node(0,0,lookahead);
    else
    {
        cout << "\nsyntax error in " << lookahead << '\n';
        amount_of_errors++;
        return 0;
    }
}
node *expr();
node *factor()
{
    if (lookahead=='(')
    {
        match('(');node *t=expr(); match(')');
        return t;
    }
    else
    {
        node *t = scan();
        match(lookahead);
        return t;
    }
}
node *prim();
node *prim1()
{
    if (lookahead=='*')
    {
        match('*'); return prim();
    }
    else if (lookahead=='/')
    {
        match('/'); return prim();
    }
    else {}
}
node *prim()
{
    node *t1=factor();
    if (lookahead=='*' || lookahead=='/')
    {
        char c=lookahead;
        node *t2=prim1();
        return new node(t1,t2,c);
    }
    else return t1;
}
node *expr1()
{
    if (lookahead=='-')
    {
        match('-'); return expr();
    }
    else if (lookahead=='+')
    {
        match('+'); return expr();
    }
    else {}
}
node *expr()
{
    node *t1=prim();
    if (lookahead=='+' || lookahead=='-')
    {
        char c=lookahead;
        node *t2=expr1();
        return new node(t1,t2,c);
    }
    else return t1;
}
void super_print(node *t)
{
    if (t)
    {
        if (t->r)super_print(t->r);
        if (t->l)super_print(t->l);
 
        if (strchr("*+/-",t->val))
        {
            if (!strchr("*+/-",t->l->val) && !strchr("*+/-",t->r->val)) cout << t->l->val;
            cout << t->val;
            if (!strchr("*+/-",t->l->val)&& strchr("*+/-",t->r->val)) cout << t->l->val;
            if (!strchr("*+/-",t->r->val)) cout << t->r->val;
            cout << '>';
        }
    }
}
int main()
{
    node *root=0;
    match(lookahead);
    root=expr();
    if (amount_of_errors)
    {
        cout << "errors presents in tree constructing\n";
    }
    else
    {
        //print(root,0);
        super_print(root);
    }
    del(root);
    return 0;
}
она принимает только числа из одного знака и не умеет пропускать пробелы. Только вот что программа должна выводить вот на это 4+6*9-2*8? ибо в нотации, требуемой твоим преподом ,токое адекватно не выведешь. в том числе и это 784*(78+(75/5))-3*4 тут только 3*4>75/5>+>78>*>748>->.
0
SameeR
3 / 3 / 0
Регистрация: 10.04.2010
Сообщений: 14
12.04.2010, 01:00  [ТС] #5
Цитата Сообщение от Aye Aye Посмотреть сообщение
она принимает только числа из одного знака и не умеет пропускать пробелы. Только вот что программа должна выводить вот на это 4+6*9-2*8? ибо в нотации, требуемой твоим преподом ,токое адекватно не выведешь. в том числе и это 784*(78+(75/5))-3*4 тут только 3*4>75/5>+>78>*>748>->.
2>+>6*9>->2*8
0
taras atavin
Ушёл с форума.
3569 / 1753 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
12.04.2010, 06:25 #6
Цитата Сообщение от Aye Aye Посмотреть сообщение
в общем преподу надо чотобы программа выводила последовательность действий с учетом приоритетов или что? "то как она решена" - это не понятно. ну например:
выражение 3*(9-5)+1 должно быть переведено в + * 3 - 9 5 1, префиксная нотация. так? или надо перевесли в постфиксную нотацию? дерево при выполнении можно использовать?
Ещё вариант: 3*(9-5=4)=12+1=13. Так вывести?
0
SameeR
3 / 3 / 0
Регистрация: 10.04.2010
Сообщений: 14
13.04.2010, 07:20  [ТС] #7
хм можно наверно надо уточнить

Добавлено через 22 часа 45 минут
мда. препод говорить что надо делать через нити. dizi. не знаю как перевести на русский
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.04.2010, 07:20
Привет! Вот еще темы с ответами:

Калькулятор - C++
Вот сам калькулятор: #include&lt;conio.h&gt; #include&lt;locale.h&gt; #include&lt;stdio.h&gt; #define END '0' #define ERROR -1 #include&lt;stdlib.h&gt;...

Калькулятор - C++
Написал примитивный калькулятор: #include &lt;iostream&gt; #include &lt;locale.h&gt; #include &lt;conio.h&gt; using namespace std; int...

Калькулятор - C++
Есть такое условие: If(b=='+') s=a+b; как сделать так чтобы я мог додавать не два числа а a+b+...+n

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


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
13.04.2010, 07:20
Ответ Создать тему
Опции темы

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