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

Калькулятор

11.04.2010, 01:14. Просмотров 823. Ответов 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
11.04.2010, 01:14
Ответы с готовыми решениями:

Как преобразовать обычный калькулятор в калькулятор использующий класс стек?
#include &lt;iostream&gt; int main(){ int a = 0; int b = 0; char operation; ...

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

калькулятор
делаю калькулятор...столкнулся с проблемкой...при вычислении чисел с плавающей точкой...как можно...

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

6
372 / 286 / 97
Регистрация: 17.12.2009
Сообщений: 567
11.04.2010, 01:24 2
в общем преподу надо чотобы программа выводила последовательность действий с учетом приоритетов или что? "то как она решена" - это не понятно. ну например:
выражение 3*(9-5)+1 должно быть переведено в + * 3 - 9 5 1, префиксная нотация. так? или надо перевесли в постфиксную нотацию? дерево при выполнении можно использовать?
0
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
372 / 286 / 97
Регистрация: 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
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
4196 / 1789 / 211
Регистрация: 24.11.2009
Сообщений: 27,563
12.04.2010, 06:25 6
Цитата Сообщение от Aye Aye Посмотреть сообщение
в общем преподу надо чотобы программа выводила последовательность действий с учетом приоритетов или что? "то как она решена" - это не понятно. ну например:
выражение 3*(9-5)+1 должно быть переведено в + * 3 - 9 5 1, префиксная нотация. так? или надо перевесли в постфиксную нотацию? дерево при выполнении можно использовать?
Ещё вариант: 3*(9-5=4)=12+1=13. Так вывести?
0
3 / 3 / 0
Регистрация: 10.04.2010
Сообщений: 14
13.04.2010, 07:20  [ТС] 7
хм можно наверно надо уточнить

Добавлено через 22 часа 45 минут
мда. препод говорить что надо делать через нити. dizi. не знаю как перевести на русский
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
13.04.2010, 07:20

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

Калькулятор на C++
Здравствуйте, нужна помощь в создании калькулятора. Калькулятор должен работать при вводе например:...

Калькулятор
Как создать калькулятор? Самый обычный, какой есть в стандартных программах, не инженерный. С...

калькулятор
подскажите, как сделать чтоб при вводе с клавиатуры, можно было вводить только цифры, а буквы и...

Калькулятор
Всем привет ) Пожалуйста подскажите почему мы пишем &quot; scanf (&quot;%c&quot;, &amp;oper); scanf (&quot;%c&quot;,...


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

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

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